]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/fortran/expr.c
Wrap option names in gcc internal messages with %< and %>.
[thirdparty/gcc.git] / gcc / fortran / expr.c
CommitLineData
4ee9c684 1/* Routines for manipulation of expression nodes.
fbd26352 2 Copyright (C) 2000-2019 Free Software Foundation, Inc.
4ee9c684 3 Contributed by Andy Vaught
4
c84b470d 5This file is part of GCC.
4ee9c684 6
c84b470d 7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
bdabe786 9Software Foundation; either version 3, or (at your option) any later
c84b470d 10version.
4ee9c684 11
c84b470d 12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
4ee9c684 16
17You should have received a copy of the GNU General Public License
bdabe786 18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
4ee9c684 20
21#include "config.h"
7436502b 22#include "system.h"
e4d6c7fc 23#include "coretypes.h"
1eacc14a 24#include "options.h"
4ee9c684 25#include "gfortran.h"
26#include "arith.h"
27#include "match.h"
9ba02d19 28#include "target-memory.h" /* for gfc_convert_boz */
126387b5 29#include "constructor.h"
9f4d9f83 30#include "tree.h"
4ee9c684 31
126387b5 32
33/* The following set of functions provide access to gfc_expr* of
34 various types - actual all but EXPR_FUNCTION and EXPR_VARIABLE.
35
36 There are two functions available elsewhere that provide
37 slightly different flavours of variables. Namely:
38 expr.c (gfc_get_variable_expr)
39 symbol.c (gfc_lval_expr_from_sym)
40 TODO: Merge these functions, if possible. */
41
42/* Get a new expression node. */
4ee9c684 43
44gfc_expr *
45gfc_get_expr (void)
46{
47 gfc_expr *e;
48
48d8ad5a 49 e = XCNEW (gfc_expr);
4ee9c684 50 gfc_clear_ts (&e->ts);
4ee9c684 51 e->shape = NULL;
52 e->ref = NULL;
53 e->symtree = NULL;
4ee9c684 54 return e;
55}
56
57
126387b5 58/* Get a new expression node that is an array constructor
59 of given type and kind. */
4ee9c684 60
126387b5 61gfc_expr *
62gfc_get_array_expr (bt type, int kind, locus *where)
4ee9c684 63{
126387b5 64 gfc_expr *e;
4ee9c684 65
126387b5 66 e = gfc_get_expr ();
67 e->expr_type = EXPR_ARRAY;
68 e->value.constructor = NULL;
69 e->rank = 1;
70 e->shape = NULL;
71
72 e->ts.type = type;
73 e->ts.kind = kind;
74 if (where)
75 e->where = *where;
76
77 return e;
4ee9c684 78}
79
80
126387b5 81/* Get a new expression node that is the NULL expression. */
4ee9c684 82
126387b5 83gfc_expr *
84gfc_get_null_expr (locus *where)
4ee9c684 85{
126387b5 86 gfc_expr *e;
4ee9c684 87
126387b5 88 e = gfc_get_expr ();
89 e->expr_type = EXPR_NULL;
90 e->ts.type = BT_UNKNOWN;
4ee9c684 91
126387b5 92 if (where)
93 e->where = *where;
94
95 return e;
96}
97
98
99/* Get a new expression node that is an operator expression node. */
100
101gfc_expr *
102gfc_get_operator_expr (locus *where, gfc_intrinsic_op op,
103 gfc_expr *op1, gfc_expr *op2)
104{
105 gfc_expr *e;
106
107 e = gfc_get_expr ();
108 e->expr_type = EXPR_OP;
109 e->value.op.op = op;
110 e->value.op.op1 = op1;
111 e->value.op.op2 = op2;
112
113 if (where)
114 e->where = *where;
115
116 return e;
117}
118
119
120/* Get a new expression node that is an structure constructor
121 of given type and kind. */
122
123gfc_expr *
124gfc_get_structure_constructor_expr (bt type, int kind, locus *where)
125{
126 gfc_expr *e;
127
128 e = gfc_get_expr ();
129 e->expr_type = EXPR_STRUCTURE;
130 e->value.constructor = NULL;
131
132 e->ts.type = type;
133 e->ts.kind = kind;
134 if (where)
135 e->where = *where;
136
137 return e;
138}
139
140
141/* Get a new expression node that is an constant of given type and kind. */
142
143gfc_expr *
144gfc_get_constant_expr (bt type, int kind, locus *where)
145{
146 gfc_expr *e;
147
148 if (!where)
0d2b3c9c 149 gfc_internal_error ("gfc_get_constant_expr(): locus %<where%> cannot be "
150 "NULL");
126387b5 151
152 e = gfc_get_expr ();
153
154 e->expr_type = EXPR_CONSTANT;
155 e->ts.type = type;
156 e->ts.kind = kind;
157 e->where = *where;
158
159 switch (type)
4ee9c684 160 {
126387b5 161 case BT_INTEGER:
162 mpz_init (e->value.integer);
163 break;
4ee9c684 164
126387b5 165 case BT_REAL:
166 gfc_set_model_kind (kind);
167 mpfr_init (e->value.real);
168 break;
4ee9c684 169
126387b5 170 case BT_COMPLEX:
171 gfc_set_model_kind (kind);
172 mpc_init2 (e->value.complex, mpfr_get_default_prec());
173 break;
4ee9c684 174
126387b5 175 default:
176 break;
4ee9c684 177 }
178
126387b5 179 return e;
4ee9c684 180}
181
182
126387b5 183/* Get a new expression node that is an string constant.
184 If no string is passed, a string of len is allocated,
185 blanked and null-terminated. */
4ee9c684 186
126387b5 187gfc_expr *
9f4d9f83 188gfc_get_character_expr (int kind, locus *where, const char *src, gfc_charlen_t len)
4ee9c684 189{
126387b5 190 gfc_expr *e;
191 gfc_char_t *dest;
4ee9c684 192
126387b5 193 if (!src)
4ee9c684 194 {
126387b5 195 dest = gfc_get_wide_string (len + 1);
196 gfc_wide_memset (dest, ' ', len);
197 dest[len] = '\0';
198 }
199 else
200 dest = gfc_char_to_widechar (src);
4ee9c684 201
126387b5 202 e = gfc_get_constant_expr (BT_CHARACTER, kind,
203 where ? where : &gfc_current_locus);
204 e->value.character.string = dest;
205 e->value.character.length = len;
206
207 return e;
208}
209
210
211/* Get a new expression node that is an integer constant. */
212
213gfc_expr *
9f4d9f83 214gfc_get_int_expr (int kind, locus *where, HOST_WIDE_INT value)
126387b5 215{
216 gfc_expr *p;
217 p = gfc_get_constant_expr (BT_INTEGER, kind,
218 where ? where : &gfc_current_locus);
219
9f4d9f83 220 const wide_int w = wi::shwi (value, kind * BITS_PER_UNIT);
221 wi::to_mpz (w, p->value.integer, SIGNED);
126387b5 222
223 return p;
224}
225
226
227/* Get a new expression node that is a logical constant. */
228
229gfc_expr *
230gfc_get_logical_expr (int kind, locus *where, bool value)
231{
232 gfc_expr *p;
233 p = gfc_get_constant_expr (BT_LOGICAL, kind,
234 where ? where : &gfc_current_locus);
235
236 p->value.logical = value;
237
238 return p;
239}
240
241
242gfc_expr *
243gfc_get_iokind_expr (locus *where, io_kind k)
244{
245 gfc_expr *e;
246
247 /* Set the types to something compatible with iokind. This is needed to
248 get through gfc_free_expr later since iokind really has no Basic Type,
249 BT, of its own. */
250
251 e = gfc_get_expr ();
252 e->expr_type = EXPR_CONSTANT;
253 e->ts.type = BT_LOGICAL;
254 e->value.iokind = k;
255 e->where = *where;
256
257 return e;
258}
259
260
261/* Given an expression pointer, return a copy of the expression. This
262 subroutine is recursive. */
263
264gfc_expr *
265gfc_copy_expr (gfc_expr *p)
266{
267 gfc_expr *q;
268 gfc_char_t *s;
269 char *c;
270
271 if (p == NULL)
272 return NULL;
273
274 q = gfc_get_expr ();
275 *q = *p;
276
277 switch (q->expr_type)
278 {
279 case EXPR_SUBSTRING:
280 s = gfc_get_wide_string (p->value.character.length + 1);
281 q->value.character.string = s;
282 memcpy (s, p->value.character.string,
283 (p->value.character.length + 1) * sizeof (gfc_char_t));
284 break;
285
286 case EXPR_CONSTANT:
287 /* Copy target representation, if it exists. */
288 if (p->representation.string)
4ee9c684 289 {
126387b5 290 c = XCNEWVEC (char, p->representation.length + 1);
291 q->representation.string = c;
292 memcpy (c, p->representation.string, (p->representation.length + 1));
293 }
294
295 /* Copy the values of any pointer components of p->value. */
296 switch (q->ts.type)
297 {
298 case BT_INTEGER:
299 mpz_init_set (q->value.integer, p->value.integer);
300 break;
301
302 case BT_REAL:
303 gfc_set_model_kind (q->ts.kind);
304 mpfr_init (q->value.real);
305 mpfr_set (q->value.real, p->value.real, GFC_RND_MODE);
306 break;
307
308 case BT_COMPLEX:
309 gfc_set_model_kind (q->ts.kind);
310 mpc_init2 (q->value.complex, mpfr_get_default_prec());
311 mpc_set (q->value.complex, p->value.complex, GFC_MPC_RND_MODE);
312 break;
313
314 case BT_CHARACTER:
315 if (p->representation.string)
316 q->value.character.string
317 = gfc_char_to_widechar (q->representation.string);
318 else
4ee9c684 319 {
126387b5 320 s = gfc_get_wide_string (p->value.character.length + 1);
321 q->value.character.string = s;
4ee9c684 322
126387b5 323 /* This is the case for the C_NULL_CHAR named constant. */
324 if (p->value.character.length == 0
325 && (p->ts.is_c_interop || p->ts.is_iso_c))
326 {
327 *s = '\0';
328 /* Need to set the length to 1 to make sure the NUL
329 terminator is copied. */
330 q->value.character.length = 1;
331 }
332 else
333 memcpy (s, p->value.character.string,
334 (p->value.character.length + 1) * sizeof (gfc_char_t));
335 }
4ee9c684 336 break;
337
126387b5 338 case BT_HOLLERITH:
339 case BT_LOGICAL:
d7cd448a 340 case_bt_struct:
126387b5 341 case BT_CLASS:
8c2d8d6d 342 case BT_ASSUMED:
126387b5 343 break; /* Already done. */
344
345 case BT_PROCEDURE:
346 case BT_VOID:
347 /* Should never be reached. */
348 case BT_UNKNOWN:
349 gfc_internal_error ("gfc_copy_expr(): Bad expr node");
350 /* Not reached. */
351 }
352
353 break;
354
355 case EXPR_OP:
356 switch (q->value.op.op)
357 {
358 case INTRINSIC_NOT:
359 case INTRINSIC_PARENTHESES:
360 case INTRINSIC_UPLUS:
361 case INTRINSIC_UMINUS:
362 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
4ee9c684 363 break;
364
126387b5 365 default: /* Binary operators. */
366 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
367 q->value.op.op2 = gfc_copy_expr (p->value.op.op2);
4ee9c684 368 break;
369 }
370
126387b5 371 break;
372
373 case EXPR_FUNCTION:
374 q->value.function.actual =
375 gfc_copy_actual_arglist (p->value.function.actual);
376 break;
377
378 case EXPR_COMPCALL:
379 case EXPR_PPC:
380 q->value.compcall.actual =
381 gfc_copy_actual_arglist (p->value.compcall.actual);
382 q->value.compcall.tbp = p->value.compcall.tbp;
383 break;
384
385 case EXPR_STRUCTURE:
386 case EXPR_ARRAY:
387 q->value.constructor = gfc_constructor_copy (p->value.constructor);
388 break;
389
390 case EXPR_VARIABLE:
391 case EXPR_NULL:
392 break;
4ee9c684 393 }
126387b5 394
395 q->shape = gfc_copy_shape (p->shape, p->rank);
396
397 q->ref = gfc_copy_ref (p->ref);
398
9d958d5b 399 if (p->param_list)
400 q->param_list = gfc_copy_actual_arglist (p->param_list);
401
126387b5 402 return q;
4ee9c684 403}
404
405
a9031a3e 406void
407gfc_clear_shape (mpz_t *shape, int rank)
408{
409 int i;
410
411 for (i = 0; i < rank; i++)
412 mpz_clear (shape[i]);
413}
414
415
416void
417gfc_free_shape (mpz_t **shape, int rank)
418{
642aa6bf 419 if (*shape == NULL)
420 return;
421
a9031a3e 422 gfc_clear_shape (*shape, rank);
423 free (*shape);
424 *shape = NULL;
425}
426
427
4ee9c684 428/* Workhorse function for gfc_free_expr() that frees everything
429 beneath an expression node, but not the node itself. This is
430 useful when we want to simplify a node and replace it with
431 something else or the expression node belongs to another structure. */
432
433static void
1a9745d2 434free_expr0 (gfc_expr *e)
4ee9c684 435{
4ee9c684 436 switch (e->expr_type)
437 {
438 case EXPR_CONSTANT:
667787ce 439 /* Free any parts of the value that need freeing. */
4ee9c684 440 switch (e->ts.type)
441 {
442 case BT_INTEGER:
443 mpz_clear (e->value.integer);
444 break;
445
446 case BT_REAL:
4b1085db 447 mpfr_clear (e->value.real);
4ee9c684 448 break;
449
450 case BT_CHARACTER:
434f0922 451 free (e->value.character.string);
4ee9c684 452 break;
453
454 case BT_COMPLEX:
f8e9f06c 455 mpc_clear (e->value.complex);
4ee9c684 456 break;
457
458 default:
459 break;
460 }
461
c32f863c 462 /* Free the representation. */
dd045aee 463 free (e->representation.string);
667787ce 464
4ee9c684 465 break;
466
467 case EXPR_OP:
9b773341 468 if (e->value.op.op1 != NULL)
469 gfc_free_expr (e->value.op.op1);
470 if (e->value.op.op2 != NULL)
471 gfc_free_expr (e->value.op.op2);
4ee9c684 472 break;
473
474 case EXPR_FUNCTION:
475 gfc_free_actual_arglist (e->value.function.actual);
476 break;
477
930fe1de 478 case EXPR_COMPCALL:
64e93293 479 case EXPR_PPC:
930fe1de 480 gfc_free_actual_arglist (e->value.compcall.actual);
481 break;
482
4ee9c684 483 case EXPR_VARIABLE:
484 break;
485
486 case EXPR_ARRAY:
487 case EXPR_STRUCTURE:
126387b5 488 gfc_constructor_free (e->value.constructor);
4ee9c684 489 break;
490
491 case EXPR_SUBSTRING:
434f0922 492 free (e->value.character.string);
4ee9c684 493 break;
494
495 case EXPR_NULL:
496 break;
497
498 default:
499 gfc_internal_error ("free_expr0(): Bad expr type");
500 }
501
502 /* Free a shape array. */
642aa6bf 503 gfc_free_shape (&e->shape, e->rank);
126387b5 504
505 gfc_free_ref_list (e->ref);
506
9d958d5b 507 gfc_free_actual_arglist (e->param_list);
508
126387b5 509 memset (e, '\0', sizeof (gfc_expr));
510}
511
512
513/* Free an expression node and everything beneath it. */
514
515void
516gfc_free_expr (gfc_expr *e)
517{
518 if (e == NULL)
519 return;
520 free_expr0 (e);
434f0922 521 free (e);
126387b5 522}
523
524
525/* Free an argument list and everything below it. */
526
527void
528gfc_free_actual_arglist (gfc_actual_arglist *a1)
529{
530 gfc_actual_arglist *a2;
531
532 while (a1)
533 {
534 a2 = a1->next;
9d958d5b 535 if (a1->expr)
126387b5 536 gfc_free_expr (a1->expr);
434f0922 537 free (a1);
126387b5 538 a1 = a2;
539 }
540}
541
542
543/* Copy an arglist structure and all of the arguments. */
544
545gfc_actual_arglist *
546gfc_copy_actual_arglist (gfc_actual_arglist *p)
547{
548 gfc_actual_arglist *head, *tail, *new_arg;
549
550 head = tail = NULL;
551
552 for (; p; p = p->next)
553 {
554 new_arg = gfc_get_actual_arglist ();
555 *new_arg = *p;
556
557 new_arg->expr = gfc_copy_expr (p->expr);
558 new_arg->next = NULL;
559
560 if (head == NULL)
561 head = new_arg;
562 else
563 tail->next = new_arg;
564
565 tail = new_arg;
566 }
567
568 return head;
569}
570
571
572/* Free a list of reference structures. */
573
574void
575gfc_free_ref_list (gfc_ref *p)
576{
577 gfc_ref *q;
578 int i;
579
580 for (; p; p = q)
581 {
582 q = p->next;
4ee9c684 583
126387b5 584 switch (p->type)
585 {
586 case REF_ARRAY:
587 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
588 {
589 gfc_free_expr (p->u.ar.start[i]);
590 gfc_free_expr (p->u.ar.end[i]);
591 gfc_free_expr (p->u.ar.stride[i]);
592 }
4ee9c684 593
126387b5 594 break;
4ee9c684 595
126387b5 596 case REF_SUBSTRING:
597 gfc_free_expr (p->u.ss.start);
598 gfc_free_expr (p->u.ss.end);
599 break;
4ee9c684 600
126387b5 601 case REF_COMPONENT:
23421d88 602 case REF_INQUIRY:
126387b5 603 break;
604 }
4ee9c684 605
434f0922 606 free (p);
126387b5 607 }
4ee9c684 608}
609
610
611/* Graft the *src expression onto the *dest subexpression. */
612
613void
1a9745d2 614gfc_replace_expr (gfc_expr *dest, gfc_expr *src)
4ee9c684 615{
4ee9c684 616 free_expr0 (dest);
617 *dest = *src;
434f0922 618 free (src);
4ee9c684 619}
620
621
622/* Try to extract an integer constant from the passed expression node.
dc326dc0 623 Return true if some error occurred, false on success. If REPORT_ERROR
624 is non-zero, emit error, for positive REPORT_ERROR using gfc_error,
625 for negative using gfc_error_now. */
4ee9c684 626
dc326dc0 627bool
628gfc_extract_int (gfc_expr *expr, int *result, int report_error)
4ee9c684 629{
87a0366f 630 gfc_ref *ref;
631
632 /* A KIND component is a parameter too. The expression for it
633 is stored in the initializer and should be consistent with
634 the tests below. */
635 if (gfc_expr_attr(expr).pdt_kind)
636 {
637 for (ref = expr->ref; ref; ref = ref->next)
638 {
639 if (ref->u.c.component->attr.pdt_kind)
640 expr = ref->u.c.component->initializer;
641 }
642 }
643
4ee9c684 644 if (expr->expr_type != EXPR_CONSTANT)
dc326dc0 645 {
646 if (report_error > 0)
647 gfc_error ("Constant expression required at %C");
648 else if (report_error < 0)
649 gfc_error_now ("Constant expression required at %C");
650 return true;
651 }
4ee9c684 652
653 if (expr->ts.type != BT_INTEGER)
dc326dc0 654 {
655 if (report_error > 0)
656 gfc_error ("Integer expression required at %C");
657 else if (report_error < 0)
658 gfc_error_now ("Integer expression required at %C");
659 return true;
660 }
4ee9c684 661
662 if ((mpz_cmp_si (expr->value.integer, INT_MAX) > 0)
663 || (mpz_cmp_si (expr->value.integer, INT_MIN) < 0))
664 {
dc326dc0 665 if (report_error > 0)
666 gfc_error ("Integer value too large in expression at %C");
667 else if (report_error < 0)
668 gfc_error_now ("Integer value too large in expression at %C");
669 return true;
4ee9c684 670 }
671
672 *result = (int) mpz_get_si (expr->value.integer);
673
dc326dc0 674 return false;
4ee9c684 675}
676
677
9f4d9f83 678/* Same as gfc_extract_int, but use a HWI. */
679
680bool
681gfc_extract_hwi (gfc_expr *expr, HOST_WIDE_INT *result, int report_error)
682{
683 gfc_ref *ref;
684
685 /* A KIND component is a parameter too. The expression for it is
686 stored in the initializer and should be consistent with the tests
687 below. */
688 if (gfc_expr_attr(expr).pdt_kind)
689 {
690 for (ref = expr->ref; ref; ref = ref->next)
691 {
692 if (ref->u.c.component->attr.pdt_kind)
693 expr = ref->u.c.component->initializer;
694 }
695 }
696
697 if (expr->expr_type != EXPR_CONSTANT)
698 {
699 if (report_error > 0)
700 gfc_error ("Constant expression required at %C");
701 else if (report_error < 0)
702 gfc_error_now ("Constant expression required at %C");
703 return true;
704 }
705
706 if (expr->ts.type != BT_INTEGER)
707 {
708 if (report_error > 0)
709 gfc_error ("Integer expression required at %C");
710 else if (report_error < 0)
711 gfc_error_now ("Integer expression required at %C");
712 return true;
713 }
714
715 /* Use long_long_integer_type_node to determine when to saturate. */
716 const wide_int val = wi::from_mpz (long_long_integer_type_node,
717 expr->value.integer, false);
718
719 if (!wi::fits_shwi_p (val))
720 {
721 if (report_error > 0)
722 gfc_error ("Integer value too large in expression at %C");
723 else if (report_error < 0)
724 gfc_error_now ("Integer value too large in expression at %C");
725 return true;
726 }
727
728 *result = val.to_shwi ();
729
730 return false;
731}
732
733
4ee9c684 734/* Recursively copy a list of reference structures. */
735
930fe1de 736gfc_ref *
737gfc_copy_ref (gfc_ref *src)
4ee9c684 738{
739 gfc_array_ref *ar;
740 gfc_ref *dest;
741
742 if (src == NULL)
743 return NULL;
744
745 dest = gfc_get_ref ();
746 dest->type = src->type;
747
748 switch (src->type)
749 {
750 case REF_ARRAY:
751 ar = gfc_copy_array_ref (&src->u.ar);
752 dest->u.ar = *ar;
434f0922 753 free (ar);
4ee9c684 754 break;
755
756 case REF_COMPONENT:
757 dest->u.c = src->u.c;
758 break;
759
23421d88 760 case REF_INQUIRY:
761 dest->u.i = src->u.i;
762 break;
763
4ee9c684 764 case REF_SUBSTRING:
765 dest->u.ss = src->u.ss;
766 dest->u.ss.start = gfc_copy_expr (src->u.ss.start);
767 dest->u.ss.end = gfc_copy_expr (src->u.ss.end);
768 break;
769 }
770
930fe1de 771 dest->next = gfc_copy_ref (src->next);
4ee9c684 772
773 return dest;
774}
775
776
1a9745d2 777/* Detect whether an expression has any vector index array references. */
c8df3e9c 778
779int
780gfc_has_vector_index (gfc_expr *e)
781{
1a9745d2 782 gfc_ref *ref;
c8df3e9c 783 int i;
784 for (ref = e->ref; ref; ref = ref->next)
785 if (ref->type == REF_ARRAY)
786 for (i = 0; i < ref->u.ar.dimen; i++)
787 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
788 return 1;
789 return 0;
790}
791
792
4ee9c684 793/* Copy a shape array. */
794
795mpz_t *
1a9745d2 796gfc_copy_shape (mpz_t *shape, int rank)
4ee9c684 797{
798 mpz_t *new_shape;
799 int n;
800
801 if (shape == NULL)
802 return NULL;
803
804 new_shape = gfc_get_shape (rank);
805
806 for (n = 0; n < rank; n++)
807 mpz_init_set (new_shape[n], shape[n]);
808
809 return new_shape;
810}
811
812
99afd94b 813/* Copy a shape array excluding dimension N, where N is an integer
df084314 814 constant expression. Dimensions are numbered in Fortran style --
99afd94b 815 starting with ONE.
816
817 So, if the original shape array contains R elements
818 { s1 ... sN-1 sN sN+1 ... sR-1 sR}
819 the result contains R-1 elements:
820 { s1 ... sN-1 sN+1 ... sR-1}
821
822 If anything goes wrong -- N is not a constant, its value is out
f6d0e37a 823 of range -- or anything else, just returns NULL. */
99afd94b 824
825mpz_t *
1a9745d2 826gfc_copy_shape_excluding (mpz_t *shape, int rank, gfc_expr *dim)
99afd94b 827{
828 mpz_t *new_shape, *s;
829 int i, n;
830
a90fe829 831 if (shape == NULL
99afd94b 832 || rank <= 1
833 || dim == NULL
a90fe829 834 || dim->expr_type != EXPR_CONSTANT
99afd94b 835 || dim->ts.type != BT_INTEGER)
836 return NULL;
837
838 n = mpz_get_si (dim->value.integer);
f6d0e37a 839 n--; /* Convert to zero based index. */
acf17823 840 if (n < 0 || n >= rank)
99afd94b 841 return NULL;
842
1a9745d2 843 s = new_shape = gfc_get_shape (rank - 1);
99afd94b 844
845 for (i = 0; i < rank; i++)
846 {
847 if (i == n)
1a9745d2 848 continue;
99afd94b 849 mpz_init_set (*s, shape[i]);
850 s++;
851 }
852
853 return new_shape;
854}
855
1a9745d2 856
4ee9c684 857/* Return the maximum kind of two expressions. In general, higher
858 kind numbers mean more precision for numeric types. */
859
860int
1a9745d2 861gfc_kind_max (gfc_expr *e1, gfc_expr *e2)
4ee9c684 862{
4ee9c684 863 return (e1->ts.kind > e2->ts.kind) ? e1->ts.kind : e2->ts.kind;
864}
865
866
867/* Returns nonzero if the type is numeric, zero otherwise. */
868
869static int
870numeric_type (bt type)
871{
4ee9c684 872 return type == BT_COMPLEX || type == BT_REAL || type == BT_INTEGER;
873}
874
875
876/* Returns nonzero if the typespec is a numeric type, zero otherwise. */
877
878int
1a9745d2 879gfc_numeric_ts (gfc_typespec *ts)
4ee9c684 880{
4ee9c684 881 return numeric_type (ts->type);
882}
883
884
4ee9c684 885/* Return an expression node with an optional argument list attached.
886 A variable number of gfc_expr pointers are strung together in an
887 argument list with a NULL pointer terminating the list. */
888
889gfc_expr *
1a9745d2 890gfc_build_conversion (gfc_expr *e)
4ee9c684 891{
892 gfc_expr *p;
893
894 p = gfc_get_expr ();
895 p->expr_type = EXPR_FUNCTION;
896 p->symtree = NULL;
4ee9c684 897 p->value.function.actual = gfc_get_actual_arglist ();
898 p->value.function.actual->expr = e;
899
900 return p;
901}
902
903
904/* Given an expression node with some sort of numeric binary
905 expression, insert type conversions required to make the operands
8c2c51e8 906 have the same type. Conversion warnings are disabled if wconversion
907 is set to 0.
4ee9c684 908
909 The exception is that the operands of an exponential don't have to
910 have the same type. If possible, the base is promoted to the type
911 of the exponent. For example, 1**2.3 becomes 1.0**2.3, but
b14e2757 912 1.0**2 stays as it is. */
4ee9c684 913
914void
8c2c51e8 915gfc_type_convert_binary (gfc_expr *e, int wconversion)
4ee9c684 916{
917 gfc_expr *op1, *op2;
918
9b773341 919 op1 = e->value.op.op1;
920 op2 = e->value.op.op2;
4ee9c684 921
922 if (op1->ts.type == BT_UNKNOWN || op2->ts.type == BT_UNKNOWN)
923 {
924 gfc_clear_ts (&e->ts);
925 return;
926 }
927
928 /* Kind conversions of same type. */
929 if (op1->ts.type == op2->ts.type)
930 {
4ee9c684 931 if (op1->ts.kind == op2->ts.kind)
932 {
1a9745d2 933 /* No type conversions. */
4ee9c684 934 e->ts = op1->ts;
935 goto done;
936 }
937
938 if (op1->ts.kind > op2->ts.kind)
8c2c51e8 939 gfc_convert_type_warn (op2, &op1->ts, 2, wconversion);
4ee9c684 940 else
8c2c51e8 941 gfc_convert_type_warn (op1, &op2->ts, 2, wconversion);
4ee9c684 942
943 e->ts = op1->ts;
944 goto done;
945 }
946
947 /* Integer combined with real or complex. */
948 if (op2->ts.type == BT_INTEGER)
949 {
950 e->ts = op1->ts;
951
6d921364 952 /* Special case for ** operator. */
dcb1b019 953 if (e->value.op.op == INTRINSIC_POWER)
4ee9c684 954 goto done;
955
8c2c51e8 956 gfc_convert_type_warn (e->value.op.op2, &e->ts, 2, wconversion);
4ee9c684 957 goto done;
958 }
959
960 if (op1->ts.type == BT_INTEGER)
961 {
962 e->ts = op2->ts;
8c2c51e8 963 gfc_convert_type_warn (e->value.op.op1, &e->ts, 2, wconversion);
4ee9c684 964 goto done;
965 }
966
967 /* Real combined with complex. */
968 e->ts.type = BT_COMPLEX;
969 if (op1->ts.kind > op2->ts.kind)
970 e->ts.kind = op1->ts.kind;
971 else
972 e->ts.kind = op2->ts.kind;
973 if (op1->ts.type != BT_COMPLEX || op1->ts.kind != e->ts.kind)
8c2c51e8 974 gfc_convert_type_warn (e->value.op.op1, &e->ts, 2, wconversion);
4ee9c684 975 if (op2->ts.type != BT_COMPLEX || op2->ts.kind != e->ts.kind)
8c2c51e8 976 gfc_convert_type_warn (e->value.op.op2, &e->ts, 2, wconversion);
4ee9c684 977
978done:
979 return;
980}
981
982
3971fdfe 983/* Determine if an expression is constant in the sense of F08:7.1.12.
789702cd 984 * This function expects that the expression has already been simplified. */
4ee9c684 985
789702cd 986bool
1a9745d2 987gfc_is_constant_expr (gfc_expr *e)
4ee9c684 988{
989 gfc_constructor *c;
990 gfc_actual_arglist *arg;
4ee9c684 991
992 if (e == NULL)
789702cd 993 return true;
4ee9c684 994
995 switch (e->expr_type)
996 {
997 case EXPR_OP:
126387b5 998 return (gfc_is_constant_expr (e->value.op.op1)
999 && (e->value.op.op2 == NULL
1000 || gfc_is_constant_expr (e->value.op.op2)));
4ee9c684 1001
1002 case EXPR_VARIABLE:
9d958d5b 1003 /* The only context in which this can occur is in a parameterized
1004 derived type declaration, so returning true is OK. */
1005 if (e->symtree->n.sym->attr.pdt_len
1006 || e->symtree->n.sym->attr.pdt_kind)
1007 return true;
789702cd 1008 return false;
4ee9c684 1009
1010 case EXPR_FUNCTION:
21d5f487 1011 case EXPR_PPC:
1012 case EXPR_COMPCALL:
d12dee06 1013 gcc_assert (e->symtree || e->value.function.esym
1014 || e->value.function.isym);
1015
4ee9c684 1016 /* Call to intrinsic with at least one argument. */
4ee9c684 1017 if (e->value.function.isym && e->value.function.actual)
1018 {
1019 for (arg = e->value.function.actual; arg; arg = arg->next)
126387b5 1020 if (!gfc_is_constant_expr (arg->expr))
789702cd 1021 return false;
4ee9c684 1022 }
b9973141 1023
b9973141 1024 if (e->value.function.isym
1025 && (e->value.function.isym->elemental
1026 || e->value.function.isym->pure
1027 || e->value.function.isym->inquiry
1028 || e->value.function.isym->transformational))
789702cd 1029 return true;
b9973141 1030
789702cd 1031 return false;
4ee9c684 1032
1033 case EXPR_CONSTANT:
1034 case EXPR_NULL:
789702cd 1035 return true;
4ee9c684 1036
1037 case EXPR_SUBSTRING:
126387b5 1038 return e->ref == NULL || (gfc_is_constant_expr (e->ref->u.ss.start)
1039 && gfc_is_constant_expr (e->ref->u.ss.end));
4ee9c684 1040
f4018f95 1041 case EXPR_ARRAY:
4ee9c684 1042 case EXPR_STRUCTURE:
f4018f95 1043 c = gfc_constructor_first (e->value.constructor);
1044 if ((e->expr_type == EXPR_ARRAY) && c && c->iterator)
1045 return gfc_constant_ac (e);
1046
1047 for (; c; c = gfc_constructor_next (c))
4ee9c684 1048 if (!gfc_is_constant_expr (c->expr))
789702cd 1049 return false;
4ee9c684 1050
789702cd 1051 return true;
4ee9c684 1052
4ee9c684 1053
1054 default:
1055 gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
789702cd 1056 return false;
4ee9c684 1057 }
4ee9c684 1058}
1059
1060
1033248c 1061/* Is true if an array reference is followed by a component or substring
1062 reference. */
1063bool
1064is_subref_array (gfc_expr * e)
1065{
1066 gfc_ref * ref;
1067 bool seen_array;
1068
1069 if (e->expr_type != EXPR_VARIABLE)
1070 return false;
1071
1072 if (e->symtree->n.sym->attr.subref_array_pointer)
1073 return true;
1074
1075 seen_array = false;
285eb84d 1076
1033248c 1077 for (ref = e->ref; ref; ref = ref->next)
1078 {
285eb84d 1079 /* If we haven't seen the array reference and this is an intrinsic,
1080 what follows cannot be a subreference array. */
1081 if (!seen_array && ref->type == REF_COMPONENT
1082 && ref->u.c.component->ts.type != BT_CLASS
1083 && !gfc_bt_struct (ref->u.c.component->ts.type))
1084 return false;
1085
1033248c 1086 if (ref->type == REF_ARRAY
1087 && ref->u.ar.type != AR_ELEMENT)
1088 seen_array = true;
1089
1090 if (seen_array
1091 && ref->type != REF_ARRAY)
1092 return seen_array;
1093 }
285eb84d 1094
1095 if (e->symtree->n.sym->ts.type == BT_CLASS
1096 && e->symtree->n.sym->attr.dummy
1097 && CLASS_DATA (e->symtree->n.sym)->attr.dimension
1098 && CLASS_DATA (e->symtree->n.sym)->attr.class_pointer)
1099 return true;
1100
1033248c 1101 return false;
1102}
1103
1104
4ee9c684 1105/* Try to collapse intrinsic expressions. */
1106
60e19868 1107static bool
1a9745d2 1108simplify_intrinsic_op (gfc_expr *p, int type)
4ee9c684 1109{
f47957c7 1110 gfc_intrinsic_op op;
4ee9c684 1111 gfc_expr *op1, *op2, *result;
1112
dcb1b019 1113 if (p->value.op.op == INTRINSIC_USER)
60e19868 1114 return true;
4ee9c684 1115
9b773341 1116 op1 = p->value.op.op1;
1117 op2 = p->value.op.op2;
dcb1b019 1118 op = p->value.op.op;
4ee9c684 1119
60e19868 1120 if (!gfc_simplify_expr (op1, type))
1121 return false;
1122 if (!gfc_simplify_expr (op2, type))
1123 return false;
4ee9c684 1124
1125 if (!gfc_is_constant_expr (op1)
1126 || (op2 != NULL && !gfc_is_constant_expr (op2)))
60e19868 1127 return true;
4ee9c684 1128
f6d0e37a 1129 /* Rip p apart. */
9b773341 1130 p->value.op.op1 = NULL;
1131 p->value.op.op2 = NULL;
4ee9c684 1132
f47957c7 1133 switch (op)
4ee9c684 1134 {
42b215cc 1135 case INTRINSIC_PARENTHESES:
02eddeb0 1136 result = gfc_parentheses (op1);
1137 break;
1138
1139 case INTRINSIC_UPLUS:
4ee9c684 1140 result = gfc_uplus (op1);
1141 break;
1142
1143 case INTRINSIC_UMINUS:
1144 result = gfc_uminus (op1);
1145 break;
1146
1147 case INTRINSIC_PLUS:
1148 result = gfc_add (op1, op2);
1149 break;
1150
1151 case INTRINSIC_MINUS:
1152 result = gfc_subtract (op1, op2);
1153 break;
1154
1155 case INTRINSIC_TIMES:
1156 result = gfc_multiply (op1, op2);
1157 break;
1158
1159 case INTRINSIC_DIVIDE:
1160 result = gfc_divide (op1, op2);
1161 break;
1162
1163 case INTRINSIC_POWER:
1164 result = gfc_power (op1, op2);
1165 break;
1166
1167 case INTRINSIC_CONCAT:
1168 result = gfc_concat (op1, op2);
1169 break;
1170
1171 case INTRINSIC_EQ:
f47957c7 1172 case INTRINSIC_EQ_OS:
1173 result = gfc_eq (op1, op2, op);
4ee9c684 1174 break;
1175
1176 case INTRINSIC_NE:
f47957c7 1177 case INTRINSIC_NE_OS:
1178 result = gfc_ne (op1, op2, op);
4ee9c684 1179 break;
1180
1181 case INTRINSIC_GT:
f47957c7 1182 case INTRINSIC_GT_OS:
1183 result = gfc_gt (op1, op2, op);
4ee9c684 1184 break;
1185
1186 case INTRINSIC_GE:
f47957c7 1187 case INTRINSIC_GE_OS:
1188 result = gfc_ge (op1, op2, op);
4ee9c684 1189 break;
1190
1191 case INTRINSIC_LT:
f47957c7 1192 case INTRINSIC_LT_OS:
1193 result = gfc_lt (op1, op2, op);
4ee9c684 1194 break;
1195
1196 case INTRINSIC_LE:
f47957c7 1197 case INTRINSIC_LE_OS:
1198 result = gfc_le (op1, op2, op);
4ee9c684 1199 break;
1200
1201 case INTRINSIC_NOT:
1202 result = gfc_not (op1);
1203 break;
1204
1205 case INTRINSIC_AND:
1206 result = gfc_and (op1, op2);
1207 break;
1208
1209 case INTRINSIC_OR:
1210 result = gfc_or (op1, op2);
1211 break;
1212
1213 case INTRINSIC_EQV:
1214 result = gfc_eqv (op1, op2);
1215 break;
1216
1217 case INTRINSIC_NEQV:
1218 result = gfc_neqv (op1, op2);
1219 break;
1220
1221 default:
1222 gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
1223 }
1224
1225 if (result == NULL)
1226 {
1227 gfc_free_expr (op1);
1228 gfc_free_expr (op2);
60e19868 1229 return false;
4ee9c684 1230 }
1231
c6b395dd 1232 result->rank = p->rank;
1233 result->where = p->where;
4ee9c684 1234 gfc_replace_expr (p, result);
1235
60e19868 1236 return true;
4ee9c684 1237}
1238
1239
1240/* Subroutine to simplify constructor expressions. Mutually recursive
1241 with gfc_simplify_expr(). */
1242
60e19868 1243static bool
126387b5 1244simplify_constructor (gfc_constructor_base base, int type)
4ee9c684 1245{
126387b5 1246 gfc_constructor *c;
a2f51d5f 1247 gfc_expr *p;
1248
126387b5 1249 for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
4ee9c684 1250 {
1251 if (c->iterator
60e19868 1252 && (!gfc_simplify_expr(c->iterator->start, type)
1253 || !gfc_simplify_expr (c->iterator->end, type)
1254 || !gfc_simplify_expr (c->iterator->step, type)))
1255 return false;
4ee9c684 1256
a2f51d5f 1257 if (c->expr)
1258 {
1259 /* Try and simplify a copy. Replace the original if successful
1260 but keep going through the constructor at all costs. Not
1261 doing so can make a dog's dinner of complicated things. */
1262 p = gfc_copy_expr (c->expr);
1263
60e19868 1264 if (!gfc_simplify_expr (p, type))
a2f51d5f 1265 {
1266 gfc_free_expr (p);
1267 continue;
1268 }
1269
1270 gfc_replace_expr (c->expr, p);
1271 }
4ee9c684 1272 }
1273
60e19868 1274 return true;
4ee9c684 1275}
1276
1277
1278/* Pull a single array element out of an array constructor. */
1279
60e19868 1280static bool
126387b5 1281find_array_element (gfc_constructor_base base, gfc_array_ref *ar,
1a9745d2 1282 gfc_constructor **rval)
4ee9c684 1283{
1284 unsigned long nelemen;
1285 int i;
1286 mpz_t delta;
1287 mpz_t offset;
8af82abc 1288 mpz_t span;
1289 mpz_t tmp;
126387b5 1290 gfc_constructor *cons;
dd5b9961 1291 gfc_expr *e;
60e19868 1292 bool t;
dd5b9961 1293
60e19868 1294 t = true;
dd5b9961 1295 e = NULL;
4ee9c684 1296
1297 mpz_init_set_ui (offset, 0);
1298 mpz_init (delta);
8af82abc 1299 mpz_init (tmp);
1300 mpz_init_set_ui (span, 1);
4ee9c684 1301 for (i = 0; i < ar->dimen; i++)
1302 {
60e19868 1303 if (!gfc_reduce_init_expr (ar->as->lower[i])
1304 || !gfc_reduce_init_expr (ar->as->upper[i]))
61fdf697 1305 {
60e19868 1306 t = false;
61fdf697 1307 cons = NULL;
1308 goto depart;
1309 }
1310
f48281e6 1311 e = ar->start[i];
dd5b9961 1312 if (e->expr_type != EXPR_CONSTANT)
4ee9c684 1313 {
1314 cons = NULL;
dd5b9961 1315 goto depart;
4ee9c684 1316 }
bbecc14e 1317
61fdf697 1318 gcc_assert (ar->as->upper[i]->expr_type == EXPR_CONSTANT
1319 && ar->as->lower[i]->expr_type == EXPR_CONSTANT);
1320
bbecc14e 1321 /* Check the bounds. */
43b3b93d 1322 if ((ar->as->upper[i]
298ed4ca 1323 && mpz_cmp (e->value.integer,
1324 ar->as->upper[i]->value.integer) > 0)
61fdf697 1325 || (mpz_cmp (e->value.integer,
1326 ar->as->lower[i]->value.integer) < 0))
dd5b9961 1327 {
43b3b93d 1328 gfc_error ("Index in dimension %d is out of bounds "
dd5b9961 1329 "at %L", i + 1, &ar->c_where[i]);
1330 cons = NULL;
60e19868 1331 t = false;
dd5b9961 1332 goto depart;
1333 }
1334
1a9745d2 1335 mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer);
8af82abc 1336 mpz_mul (delta, delta, span);
4ee9c684 1337 mpz_add (offset, offset, delta);
8af82abc 1338
1339 mpz_set_ui (tmp, 1);
1340 mpz_add (tmp, tmp, ar->as->upper[i]->value.integer);
1341 mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
1342 mpz_mul (span, span, tmp);
4ee9c684 1343 }
1344
126387b5 1345 for (cons = gfc_constructor_first (base), nelemen = mpz_get_ui (offset);
1346 cons && nelemen > 0; cons = gfc_constructor_next (cons), nelemen--)
298ed4ca 1347 {
126387b5 1348 if (cons->iterator)
298ed4ca 1349 {
126387b5 1350 cons = NULL;
1351 goto depart;
298ed4ca 1352 }
1353 }
4ee9c684 1354
dd5b9961 1355depart:
4ee9c684 1356 mpz_clear (delta);
1357 mpz_clear (offset);
8af82abc 1358 mpz_clear (span);
1359 mpz_clear (tmp);
dd5b9961 1360 *rval = cons;
1361 return t;
4ee9c684 1362}
1363
1364
1365/* Find a component of a structure constructor. */
1366
1367static gfc_constructor *
126387b5 1368find_component_ref (gfc_constructor_base base, gfc_ref *ref)
4ee9c684 1369{
9e1d7062 1370 gfc_component *pick = ref->u.c.component;
126387b5 1371 gfc_constructor *c = gfc_constructor_first (base);
4ee9c684 1372
9e1d7062 1373 gfc_symbol *dt = ref->u.c.sym;
1374 int ext = dt->attr.extension;
1375
1376 /* For extended types, check if the desired component is in one of the
1377 * parent types. */
1378 while (ext > 0 && gfc_find_component (dt->components->ts.u.derived,
d7cd448a 1379 pick->name, true, true, NULL))
9e1d7062 1380 {
1381 dt = dt->components->ts.u.derived;
1382 c = gfc_constructor_first (c->expr->value.constructor);
1383 ext--;
1384 }
1385
1386 gfc_component *comp = dt->components;
4ee9c684 1387 while (comp != pick)
1388 {
1389 comp = comp->next;
126387b5 1390 c = gfc_constructor_next (c);
4ee9c684 1391 }
1392
126387b5 1393 return c;
4ee9c684 1394}
1395
1396
1397/* Replace an expression with the contents of a constructor, removing
1398 the subobject reference in the process. */
1399
1400static void
1a9745d2 1401remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
4ee9c684 1402{
1403 gfc_expr *e;
1404
14c92e72 1405 if (cons)
1406 {
1407 e = cons->expr;
1408 cons->expr = NULL;
1409 }
1410 else
1411 e = gfc_copy_expr (p);
4ee9c684 1412 e->ref = p->ref->next;
1413 p->ref->next = NULL;
1414 gfc_replace_expr (p, e);
1415}
1416
1417
dd5b9961 1418/* Pull an array section out of an array constructor. */
1419
60e19868 1420static bool
dd5b9961 1421find_array_section (gfc_expr *expr, gfc_ref *ref)
1422{
1423 int idx;
1424 int rank;
1425 int d;
be45b049 1426 int shape_i;
ee8fe25b 1427 int limit;
dd5b9961 1428 long unsigned one = 1;
be45b049 1429 bool incr_ctr;
d95efb59 1430 mpz_t start[GFC_MAX_DIMENSIONS];
dd5b9961 1431 mpz_t end[GFC_MAX_DIMENSIONS];
1432 mpz_t stride[GFC_MAX_DIMENSIONS];
1433 mpz_t delta[GFC_MAX_DIMENSIONS];
1434 mpz_t ctr[GFC_MAX_DIMENSIONS];
1435 mpz_t delta_mpz;
1436 mpz_t tmp_mpz;
1437 mpz_t nelts;
1438 mpz_t ptr;
126387b5 1439 gfc_constructor_base base;
1440 gfc_constructor *cons, *vecsub[GFC_MAX_DIMENSIONS];
dd5b9961 1441 gfc_expr *begin;
1442 gfc_expr *finish;
1443 gfc_expr *step;
1444 gfc_expr *upper;
1445 gfc_expr *lower;
60e19868 1446 bool t;
dd5b9961 1447
60e19868 1448 t = true;
dd5b9961 1449
1450 base = expr->value.constructor;
1451 expr->value.constructor = NULL;
1452
1453 rank = ref->u.ar.as->rank;
1454
1455 if (expr->shape == NULL)
1456 expr->shape = gfc_get_shape (rank);
1457
1458 mpz_init_set_ui (delta_mpz, one);
1459 mpz_init_set_ui (nelts, one);
1460 mpz_init (tmp_mpz);
1461
1462 /* Do the initialization now, so that we can cleanup without
1463 keeping track of where we were. */
1464 for (d = 0; d < rank; d++)
1465 {
1466 mpz_init (delta[d]);
d95efb59 1467 mpz_init (start[d]);
dd5b9961 1468 mpz_init (end[d]);
1469 mpz_init (ctr[d]);
1470 mpz_init (stride[d]);
be45b049 1471 vecsub[d] = NULL;
dd5b9961 1472 }
1473
1474 /* Build the counters to clock through the array reference. */
be45b049 1475 shape_i = 0;
dd5b9961 1476 for (d = 0; d < rank; d++)
1477 {
1478 /* Make this stretch of code easier on the eye! */
1479 begin = ref->u.ar.start[d];
1480 finish = ref->u.ar.end[d];
1481 step = ref->u.ar.stride[d];
1482 lower = ref->u.ar.as->lower[d];
1483 upper = ref->u.ar.as->upper[d];
1484
be45b049 1485 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
1a9745d2 1486 {
126387b5 1487 gfc_constructor *ci;
1a9745d2 1488 gcc_assert (begin);
a6e22f8c 1489
f8f5ab67 1490 if (begin->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (begin))
a6e22f8c 1491 {
60e19868 1492 t = false;
a6e22f8c 1493 goto cleanup;
1494 }
1495
1a9745d2 1496 gcc_assert (begin->rank == 1);
77ca2008 1497 /* Zero-sized arrays have no shape and no elements, stop early. */
a90fe829 1498 if (!begin->shape)
77ca2008 1499 {
1500 mpz_init_set_ui (nelts, 0);
1501 break;
1502 }
dd5b9961 1503
126387b5 1504 vecsub[d] = gfc_constructor_first (begin->value.constructor);
be45b049 1505 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1506 mpz_mul (nelts, nelts, begin->shape[0]);
1507 mpz_set (expr->shape[shape_i++], begin->shape[0]);
dd5b9961 1508
be45b049 1509 /* Check bounds. */
126387b5 1510 for (ci = vecsub[d]; ci; ci = gfc_constructor_next (ci))
be45b049 1511 {
126387b5 1512 if (mpz_cmp (ci->expr->value.integer, upper->value.integer) > 0
1513 || mpz_cmp (ci->expr->value.integer,
1a9745d2 1514 lower->value.integer) < 0)
be45b049 1515 {
1516 gfc_error ("index in dimension %d is out of bounds "
1517 "at %L", d + 1, &ref->u.ar.c_where[d]);
60e19868 1518 t = false;
be45b049 1519 goto cleanup;
1520 }
1521 }
1a9745d2 1522 }
dd5b9961 1523 else
1a9745d2 1524 {
be45b049 1525 if ((begin && begin->expr_type != EXPR_CONSTANT)
1a9745d2 1526 || (finish && finish->expr_type != EXPR_CONSTANT)
1527 || (step && step->expr_type != EXPR_CONSTANT))
be45b049 1528 {
60e19868 1529 t = false;
be45b049 1530 goto cleanup;
1531 }
2d7f294b 1532
be45b049 1533 /* Obtain the stride. */
1534 if (step)
1535 mpz_set (stride[d], step->value.integer);
1536 else
1537 mpz_set_ui (stride[d], one);
dd5b9961 1538
be45b049 1539 if (mpz_cmp_ui (stride[d], 0) == 0)
1540 mpz_set_ui (stride[d], one);
dd5b9961 1541
be45b049 1542 /* Obtain the start value for the index. */
1543 if (begin)
1544 mpz_set (start[d], begin->value.integer);
1545 else
1546 mpz_set (start[d], lower->value.integer);
dd5b9961 1547
be45b049 1548 mpz_set (ctr[d], start[d]);
dd5b9961 1549
be45b049 1550 /* Obtain the end value for the index. */
1551 if (finish)
1552 mpz_set (end[d], finish->value.integer);
1553 else
1554 mpz_set (end[d], upper->value.integer);
1555
1556 /* Separate 'if' because elements sometimes arrive with
1557 non-null end. */
1558 if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1559 mpz_set (end [d], begin->value.integer);
1560
1561 /* Check the bounds. */
1562 if (mpz_cmp (ctr[d], upper->value.integer) > 0
1563 || mpz_cmp (end[d], upper->value.integer) > 0
1564 || mpz_cmp (ctr[d], lower->value.integer) < 0
1565 || mpz_cmp (end[d], lower->value.integer) < 0)
1566 {
1567 gfc_error ("index in dimension %d is out of bounds "
1568 "at %L", d + 1, &ref->u.ar.c_where[d]);
60e19868 1569 t = false;
be45b049 1570 goto cleanup;
1571 }
dd5b9961 1572
be45b049 1573 /* Calculate the number of elements and the shape. */
53f47202 1574 mpz_set (tmp_mpz, stride[d]);
be45b049 1575 mpz_add (tmp_mpz, end[d], tmp_mpz);
1576 mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1577 mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1578 mpz_mul (nelts, nelts, tmp_mpz);
1579
1a9745d2 1580 /* An element reference reduces the rank of the expression; don't
1581 add anything to the shape array. */
a90fe829 1582 if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT)
be45b049 1583 mpz_set (expr->shape[shape_i++], tmp_mpz);
1584 }
dd5b9961 1585
1586 /* Calculate the 'stride' (=delta) for conversion of the
1587 counter values into the index along the constructor. */
1588 mpz_set (delta[d], delta_mpz);
1589 mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1590 mpz_add_ui (tmp_mpz, tmp_mpz, one);
1591 mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1592 }
1593
dd5b9961 1594 mpz_init (ptr);
126387b5 1595 cons = gfc_constructor_first (base);
dd5b9961 1596
1597 /* Now clock through the array reference, calculating the index in
1598 the source constructor and transferring the elements to the new
0ffcfdf9 1599 constructor. */
1a9745d2 1600 for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
dd5b9961 1601 {
0ffcfdf9 1602 mpz_init_set_ui (ptr, 0);
dd5b9961 1603
be45b049 1604 incr_ctr = true;
dd5b9961 1605 for (d = 0; d < rank; d++)
1606 {
1607 mpz_set (tmp_mpz, ctr[d]);
1a9745d2 1608 mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
dd5b9961 1609 mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1610 mpz_add (ptr, ptr, tmp_mpz);
1611
be45b049 1612 if (!incr_ctr) continue;
dd5b9961 1613
1a9745d2 1614 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
be45b049 1615 {
1616 gcc_assert(vecsub[d]);
1617
126387b5 1618 if (!gfc_constructor_next (vecsub[d]))
1619 vecsub[d] = gfc_constructor_first (ref->u.ar.start[d]->value.constructor);
be45b049 1620 else
1621 {
126387b5 1622 vecsub[d] = gfc_constructor_next (vecsub[d]);
be45b049 1623 incr_ctr = false;
1624 }
1625 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1626 }
dd5b9961 1627 else
be45b049 1628 {
a90fe829 1629 mpz_add (ctr[d], ctr[d], stride[d]);
be45b049 1630
1a9745d2 1631 if (mpz_cmp_ui (stride[d], 0) > 0
1632 ? mpz_cmp (ctr[d], end[d]) > 0
1633 : mpz_cmp (ctr[d], end[d]) < 0)
be45b049 1634 mpz_set (ctr[d], start[d]);
1635 else
1636 incr_ctr = false;
1637 }
dd5b9961 1638 }
1639
ee8fe25b 1640 limit = mpz_get_ui (ptr);
829d7a08 1641 if (limit >= flag_max_array_constructor)
ee8fe25b 1642 {
1643 gfc_error ("The number of elements in the array constructor "
1644 "at %L requires an increase of the allowed %d "
2f6d557f 1645 "upper limit. See %<-fmax-array-constructor%> "
829d7a08 1646 "option", &expr->where, flag_max_array_constructor);
60e19868 1647 return false;
ee8fe25b 1648 }
1649
1650 cons = gfc_constructor_lookup (base, limit);
126387b5 1651 gcc_assert (cons);
1652 gfc_constructor_append_expr (&expr->value.constructor,
1653 gfc_copy_expr (cons->expr), NULL);
dd5b9961 1654 }
1655
1656 mpz_clear (ptr);
dd5b9961 1657
1658cleanup:
1659
1660 mpz_clear (delta_mpz);
1661 mpz_clear (tmp_mpz);
1662 mpz_clear (nelts);
1663 for (d = 0; d < rank; d++)
1664 {
1665 mpz_clear (delta[d]);
d95efb59 1666 mpz_clear (start[d]);
dd5b9961 1667 mpz_clear (end[d]);
1668 mpz_clear (ctr[d]);
1669 mpz_clear (stride[d]);
1670 }
126387b5 1671 gfc_constructor_free (base);
dd5b9961 1672 return t;
1673}
1674
1675/* Pull a substring out of an expression. */
1676
60e19868 1677static bool
dd5b9961 1678find_substring_ref (gfc_expr *p, gfc_expr **newp)
1679{
5f29dd05 1680 gfc_charlen_t end;
1681 gfc_charlen_t start;
1682 gfc_charlen_t length;
c32f863c 1683 gfc_char_t *chr;
dd5b9961 1684
1685 if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1a9745d2 1686 || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
60e19868 1687 return false;
dd5b9961 1688
1689 *newp = gfc_copy_expr (p);
434f0922 1690 free ((*newp)->value.character.string);
e5c6dbbb 1691
5f29dd05 1692 end = (gfc_charlen_t) mpz_get_ui (p->ref->u.ss.end->value.integer);
1693 start = (gfc_charlen_t) mpz_get_ui (p->ref->u.ss.start->value.integer);
1694 if (end >= start)
1695 length = end - start + 1;
1696 else
1697 length = 0;
dd5b9961 1698
c32f863c 1699 chr = (*newp)->value.character.string = gfc_get_wide_string (length + 1);
e5c6dbbb 1700 (*newp)->value.character.length = length;
c32f863c 1701 memcpy (chr, &p->value.character.string[start - 1],
1702 length * sizeof (gfc_char_t));
e5c6dbbb 1703 chr[length] = '\0';
60e19868 1704 return true;
dd5b9961 1705}
1706
1707
23421d88 1708/* Pull an inquiry result out of an expression. */
1709
1710static bool
1711find_inquiry_ref (gfc_expr *p, gfc_expr **newp)
1712{
1713 gfc_ref *ref;
1714 gfc_ref *inquiry = NULL;
1715 gfc_expr *tmp;
1716
1717 tmp = gfc_copy_expr (p);
1718
1719 if (tmp->ref && tmp->ref->type == REF_INQUIRY)
1720 {
1721 inquiry = tmp->ref;
1722 tmp->ref = NULL;
1723 }
1724 else
1725 {
1726 for (ref = tmp->ref; ref; ref = ref->next)
1727 if (ref->next && ref->next->type == REF_INQUIRY)
1728 {
1729 inquiry = ref->next;
1730 ref->next = NULL;
1731 }
1732 }
1733
1734 if (!inquiry)
1735 {
1736 gfc_free_expr (tmp);
1737 return false;
1738 }
1739
1740 gfc_resolve_expr (tmp);
1741
33b24e28 1742 /* In principle there can be more than one inquiry reference. */
1743 for (; inquiry; inquiry = inquiry->next)
23421d88 1744 {
33b24e28 1745 switch (inquiry->u.i)
1746 {
1747 case INQUIRY_LEN:
1748 if (tmp->ts.type != BT_CHARACTER)
1749 goto cleanup;
23421d88 1750
33b24e28 1751 if (!gfc_notify_std (GFC_STD_F2003, "LEN part_ref at %C"))
1752 goto cleanup;
23421d88 1753
33b24e28 1754 if (!tmp->ts.u.cl->length
1755 || tmp->ts.u.cl->length->expr_type != EXPR_CONSTANT)
1756 goto cleanup;
23421d88 1757
33b24e28 1758 *newp = gfc_copy_expr (tmp->ts.u.cl->length);
1759 break;
23421d88 1760
33b24e28 1761 case INQUIRY_KIND:
1762 if (tmp->ts.type == BT_DERIVED || tmp->ts.type == BT_CLASS)
1763 goto cleanup;
23421d88 1764
33b24e28 1765 if (!gfc_notify_std (GFC_STD_F2003, "KIND part_ref at %C"))
1766 goto cleanup;
23421d88 1767
33b24e28 1768 *newp = gfc_get_int_expr (gfc_default_integer_kind,
1769 NULL, tmp->ts.kind);
1770 break;
23421d88 1771
33b24e28 1772 case INQUIRY_RE:
1773 if (tmp->ts.type != BT_COMPLEX || tmp->expr_type != EXPR_CONSTANT)
1774 goto cleanup;
23421d88 1775
33b24e28 1776 if (!gfc_notify_std (GFC_STD_F2008, "RE part_ref at %C"))
1777 goto cleanup;
23421d88 1778
33b24e28 1779 *newp = gfc_get_constant_expr (BT_REAL, tmp->ts.kind, &tmp->where);
1780 mpfr_set ((*newp)->value.real,
1781 mpc_realref (p->value.complex), GFC_RND_MODE);
1782 break;
23421d88 1783
33b24e28 1784 case INQUIRY_IM:
1785 if (tmp->ts.type != BT_COMPLEX || tmp->expr_type != EXPR_CONSTANT)
1786 goto cleanup;
23421d88 1787
33b24e28 1788 if (!gfc_notify_std (GFC_STD_F2008, "IM part_ref at %C"))
1789 goto cleanup;
23421d88 1790
33b24e28 1791 *newp = gfc_get_constant_expr (BT_REAL, tmp->ts.kind, &tmp->where);
1792 mpfr_set ((*newp)->value.real,
1793 mpc_imagref (p->value.complex), GFC_RND_MODE);
1794 break;
1795 }
1796 tmp = gfc_copy_expr (*newp);
23421d88 1797 }
1798
1799 if (!(*newp))
1800 goto cleanup;
1801 else if ((*newp)->expr_type != EXPR_CONSTANT)
1802 {
1803 gfc_free_expr (*newp);
1804 goto cleanup;
1805 }
1806
1807 gfc_free_expr (tmp);
1808 return true;
1809
1810cleanup:
1811 gfc_free_expr (tmp);
1812 return false;
1813}
1814
1815
dd5b9961 1816
4ee9c684 1817/* Simplify a subobject reference of a constructor. This occurs when
1818 parameter variable values are substituted. */
1819
60e19868 1820static bool
1a9745d2 1821simplify_const_ref (gfc_expr *p)
4ee9c684 1822{
126387b5 1823 gfc_constructor *cons, *c;
23421d88 1824 gfc_expr *newp = NULL;
14c92e72 1825 gfc_ref *last_ref;
4ee9c684 1826
1827 while (p->ref)
1828 {
1829 switch (p->ref->type)
1830 {
1831 case REF_ARRAY:
1832 switch (p->ref->u.ar.type)
1833 {
1834 case AR_ELEMENT:
14c92e72 1835 /* <type/kind spec>, parameter :: x(<int>) = scalar_expr
1836 will generate this. */
1837 if (p->expr_type != EXPR_ARRAY)
1838 {
1839 remove_subobject_ref (p, NULL);
1840 break;
1841 }
60e19868 1842 if (!find_array_element (p->value.constructor, &p->ref->u.ar, &cons))
1843 return false;
dd5b9961 1844
4ee9c684 1845 if (!cons)
60e19868 1846 return true;
dd5b9961 1847
4ee9c684 1848 remove_subobject_ref (p, cons);
1849 break;
1850
dd5b9961 1851 case AR_SECTION:
60e19868 1852 if (!find_array_section (p, p->ref))
1853 return false;
dd5b9961 1854 p->ref->u.ar.type = AR_FULL;
1855
f6d0e37a 1856 /* Fall through. */
dd5b9961 1857
4ee9c684 1858 case AR_FULL:
dd5b9961 1859 if (p->ref->next != NULL
d7cd448a 1860 && (p->ts.type == BT_CHARACTER || gfc_bt_struct (p->ts.type)))
4ee9c684 1861 {
126387b5 1862 for (c = gfc_constructor_first (p->value.constructor);
1863 c; c = gfc_constructor_next (c))
dd5b9961 1864 {
126387b5 1865 c->expr->ref = gfc_copy_ref (p->ref->next);
60e19868 1866 if (!simplify_const_ref (c->expr))
1867 return false;
23e357d3 1868 }
1869
d7cd448a 1870 if (gfc_bt_struct (p->ts.type)
14c92e72 1871 && p->ref->next
126387b5 1872 && (c = gfc_constructor_first (p->value.constructor)))
23e357d3 1873 {
14c92e72 1874 /* There may have been component references. */
126387b5 1875 p->ts = c->expr->ts;
14c92e72 1876 }
23e357d3 1877
14c92e72 1878 last_ref = p->ref;
1879 for (; last_ref->next; last_ref = last_ref->next) {};
23e357d3 1880
14c92e72 1881 if (p->ts.type == BT_CHARACTER
1882 && last_ref->type == REF_SUBSTRING)
1883 {
1884 /* If this is a CHARACTER array and we possibly took
1885 a substring out of it, update the type-spec's
1886 character length according to the first element
1887 (as all should have the same length). */
9f4d9f83 1888 gfc_charlen_t string_len;
126387b5 1889 if ((c = gfc_constructor_first (p->value.constructor)))
23e357d3 1890 {
126387b5 1891 const gfc_expr* first = c->expr;
23e357d3 1892 gcc_assert (first->expr_type == EXPR_CONSTANT);
1893 gcc_assert (first->ts.type == BT_CHARACTER);
1894 string_len = first->value.character.length;
1895 }
1896 else
1897 string_len = 0;
1898
eeebe20b 1899 if (!p->ts.u.cl)
f8197328 1900 {
1901 if (p->symtree)
1902 p->ts.u.cl = gfc_new_charlen (p->symtree->n.sym->ns,
1903 NULL);
1904 else
1905 p->ts.u.cl = gfc_new_charlen (gfc_current_ns,
1906 NULL);
1907 }
d270ce52 1908 else
1909 gfc_free_expr (p->ts.u.cl->length);
1910
126387b5 1911 p->ts.u.cl->length
9f4d9f83 1912 = gfc_get_int_expr (gfc_charlen_int_kind,
126387b5 1913 NULL, string_len);
dd5b9961 1914 }
4ee9c684 1915 }
dd5b9961 1916 gfc_free_ref_list (p->ref);
1917 p->ref = NULL;
4ee9c684 1918 break;
1919
1920 default:
60e19868 1921 return true;
4ee9c684 1922 }
1923
1924 break;
1925
1926 case REF_COMPONENT:
1927 cons = find_component_ref (p->value.constructor, p->ref);
1928 remove_subobject_ref (p, cons);
1929 break;
1930
23421d88 1931 case REF_INQUIRY:
1932 if (!find_inquiry_ref (p, &newp))
1933 return false;
1934
1935 gfc_replace_expr (p, newp);
1936 gfc_free_ref_list (p->ref);
1937 p->ref = NULL;
1938 break;
1939
4ee9c684 1940 case REF_SUBSTRING:
23421d88 1941 if (!find_substring_ref (p, &newp))
60e19868 1942 return false;
dd5b9961 1943
1944 gfc_replace_expr (p, newp);
1945 gfc_free_ref_list (p->ref);
1946 p->ref = NULL;
1947 break;
4ee9c684 1948 }
1949 }
1950
60e19868 1951 return true;
4ee9c684 1952}
1953
1954
1955/* Simplify a chain of references. */
1956
60e19868 1957static bool
23421d88 1958simplify_ref_chain (gfc_ref *ref, int type, gfc_expr **p)
4ee9c684 1959{
1960 int n;
23421d88 1961 gfc_expr *newp;
4ee9c684 1962
1963 for (; ref; ref = ref->next)
1964 {
1965 switch (ref->type)
1966 {
1967 case REF_ARRAY:
1968 for (n = 0; n < ref->u.ar.dimen; n++)
1969 {
60e19868 1970 if (!gfc_simplify_expr (ref->u.ar.start[n], type))
1971 return false;
1972 if (!gfc_simplify_expr (ref->u.ar.end[n], type))
1973 return false;
1974 if (!gfc_simplify_expr (ref->u.ar.stride[n], type))
1975 return false;
4ee9c684 1976 }
1977 break;
1978
1979 case REF_SUBSTRING:
60e19868 1980 if (!gfc_simplify_expr (ref->u.ss.start, type))
1981 return false;
1982 if (!gfc_simplify_expr (ref->u.ss.end, type))
1983 return false;
4ee9c684 1984 break;
1985
23421d88 1986 case REF_INQUIRY:
1987 if (!find_inquiry_ref (*p, &newp))
1988 return false;
1989
1990 gfc_replace_expr (*p, newp);
1991 gfc_free_ref_list ((*p)->ref);
1992 (*p)->ref = NULL;
f8cec2ce 1993 return true;
23421d88 1994
4ee9c684 1995 default:
1996 break;
1997 }
1998 }
60e19868 1999 return true;
4ee9c684 2000}
2001
2002
2003/* Try to substitute the value of a parameter variable. */
f6d0e37a 2004
60e19868 2005static bool
1a9745d2 2006simplify_parameter_variable (gfc_expr *p, int type)
4ee9c684 2007{
2008 gfc_expr *e;
60e19868 2009 bool t;
4ee9c684 2010
60937825 2011 if (gfc_is_size_zero_array (p))
2012 {
2013 if (p->expr_type == EXPR_ARRAY)
2014 return true;
2015
2016 e = gfc_get_expr ();
2017 e->expr_type = EXPR_ARRAY;
2018 e->ts = p->ts;
2019 e->rank = p->rank;
2020 e->value.constructor = NULL;
2021 e->shape = gfc_copy_shape (p->shape, p->rank);
2022 e->where = p->where;
2023 gfc_replace_expr (p, e);
2024 return true;
2025 }
2026
4ee9c684 2027 e = gfc_copy_expr (p->symtree->n.sym->value);
dd5b9961 2028 if (e == NULL)
60e19868 2029 return false;
dd5b9961 2030
99e47bb2 2031 e->rank = p->rank;
2032
eb4df85f 2033 /* Do not copy subobject refs for constant. */
2034 if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
930fe1de 2035 e->ref = gfc_copy_ref (p->ref);
4ee9c684 2036 t = gfc_simplify_expr (e, type);
2037
f6d0e37a 2038 /* Only use the simplification if it eliminated all subobject references. */
60e19868 2039 if (t && !e->ref)
4ee9c684 2040 gfc_replace_expr (p, e);
2041 else
2042 gfc_free_expr (e);
2043
2044 return t;
2045}
2046
082b5a23 2047
2048static bool
2049scalarize_intrinsic_call (gfc_expr *, bool init_flag);
2050
4ee9c684 2051/* Given an expression, simplify it by collapsing constant
2052 expressions. Most simplification takes place when the expression
2053 tree is being constructed. If an intrinsic function is simplified
2054 at some point, we get called again to collapse the result against
2055 other constants.
2056
2057 We work by recursively simplifying expression nodes, simplifying
2058 intrinsic functions where possible, which can lead to further
2059 constant collapsing. If an operator has constant operand(s), we
2060 rip the expression apart, and rebuild it, hoping that it becomes
2061 something simpler.
2062
2063 The expression type is defined for:
2064 0 Basic expression parsing
2065 1 Simplifying array constructors -- will substitute
1a9745d2 2066 iterator values.
60e19868 2067 Returns false on error, true otherwise.
f4d3c071 2068 NOTE: Will return true even if the expression cannot be simplified. */
4ee9c684 2069
60e19868 2070bool
1a9745d2 2071gfc_simplify_expr (gfc_expr *p, int type)
4ee9c684 2072{
2073 gfc_actual_arglist *ap;
082b5a23 2074 gfc_intrinsic_sym* isym = NULL;
2075
4ee9c684 2076
2077 if (p == NULL)
60e19868 2078 return true;
4ee9c684 2079
2080 switch (p->expr_type)
2081 {
2082 case EXPR_CONSTANT:
23421d88 2083 if (p->ref && p->ref->type == REF_INQUIRY)
2084 simplify_ref_chain (p->ref, type, &p);
2085 break;
4ee9c684 2086 case EXPR_NULL:
2087 break;
2088
2089 case EXPR_FUNCTION:
9f8f5615 2090 // For array-bound functions, we don't need to optimize
2091 // the 'array' argument. In particular, if the argument
2092 // is a PARAMETER, simplifying might convert an EXPR_VARIABLE
2093 // into an EXPR_ARRAY; the latter has lbound = 1, the former
2094 // can have any lbound.
2095 ap = p->value.function.actual;
2096 if (p->value.function.isym &&
2097 (p->value.function.isym->id == GFC_ISYM_LBOUND
2098 || p->value.function.isym->id == GFC_ISYM_UBOUND
2099 || p->value.function.isym->id == GFC_ISYM_LCOBOUND
2100 || p->value.function.isym->id == GFC_ISYM_UCOBOUND))
2101 ap = ap->next;
2102
2103 for ( ; ap; ap = ap->next)
60e19868 2104 if (!gfc_simplify_expr (ap->expr, type))
2105 return false;
4ee9c684 2106
2107 if (p->value.function.isym != NULL
2108 && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
60e19868 2109 return false;
4ee9c684 2110
082b5a23 2111 if (p->expr_type == EXPR_FUNCTION)
2112 {
2113 if (p->symtree)
2114 isym = gfc_find_function (p->symtree->n.sym->name);
2115 if (isym && isym->elemental)
2116 scalarize_intrinsic_call (p, false);
2117 }
2118
4ee9c684 2119 break;
2120
2121 case EXPR_SUBSTRING:
23421d88 2122 if (!simplify_ref_chain (p->ref, type, &p))
60e19868 2123 return false;
4ee9c684 2124
eb4df85f 2125 if (gfc_is_constant_expr (p))
2126 {
c32f863c 2127 gfc_char_t *s;
9f4d9f83 2128 HOST_WIDE_INT start, end;
eb4df85f 2129
9e6639e6 2130 start = 0;
24756408 2131 if (p->ref && p->ref->u.ss.start)
2132 {
9f4d9f83 2133 gfc_extract_hwi (p->ref->u.ss.start, &start);
24756408 2134 start--; /* Convert from one-based to zero-based. */
2135 }
24756408 2136
9e6639e6 2137 end = p->value.character.length;
24756408 2138 if (p->ref && p->ref->u.ss.end)
9f4d9f83 2139 gfc_extract_hwi (p->ref->u.ss.end, &end);
24756408 2140
b9dbfade 2141 if (end < start)
2142 end = start;
2096afd8 2143
c32f863c 2144 s = gfc_get_wide_string (end - start + 2);
2145 memcpy (s, p->value.character.string + start,
2146 (end - start) * sizeof (gfc_char_t));
1a9745d2 2147 s[end - start + 1] = '\0'; /* TODO: C-style string. */
434f0922 2148 free (p->value.character.string);
eb4df85f 2149 p->value.character.string = s;
2150 p->value.character.length = end - start;
d270ce52 2151 p->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
9f4d9f83 2152 p->ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind,
126387b5 2153 NULL,
2154 p->value.character.length);
eb4df85f 2155 gfc_free_ref_list (p->ref);
2156 p->ref = NULL;
2157 p->expr_type = EXPR_CONSTANT;
2158 }
4ee9c684 2159 break;
2160
2161 case EXPR_OP:
60e19868 2162 if (!simplify_intrinsic_op (p, type))
2163 return false;
4ee9c684 2164 break;
2165
2166 case EXPR_VARIABLE:
2167 /* Only substitute array parameter variables if we are in an
1a9745d2 2168 initialization expression, or we want a subsection. */
4ee9c684 2169 if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
148aaa7f 2170 && (gfc_init_expr_flag || p->ref
98976ae1 2171 || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
4ee9c684 2172 {
60e19868 2173 if (!simplify_parameter_variable (p, type))
2174 return false;
4ee9c684 2175 break;
2176 }
2177
2178 if (type == 1)
2179 {
2180 gfc_simplify_iterator_var (p);
2181 }
2182
2183 /* Simplify subcomponent references. */
23421d88 2184 if (!simplify_ref_chain (p->ref, type, &p))
60e19868 2185 return false;
4ee9c684 2186
2187 break;
2188
2189 case EXPR_STRUCTURE:
2190 case EXPR_ARRAY:
23421d88 2191 if (!simplify_ref_chain (p->ref, type, &p))
60e19868 2192 return false;
4ee9c684 2193
60e19868 2194 if (!simplify_constructor (p->value.constructor, type))
2195 return false;
4ee9c684 2196
1a9745d2 2197 if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
2198 && p->ref->u.ar.type == AR_FULL)
58b069a0 2199 gfc_expand_constructor (p, false);
4ee9c684 2200
60e19868 2201 if (!simplify_const_ref (p))
2202 return false;
4ee9c684 2203
2204 break;
930fe1de 2205
2206 case EXPR_COMPCALL:
64e93293 2207 case EXPR_PPC:
930fe1de 2208 break;
4ee9c684 2209 }
2210
60e19868 2211 return true;
4ee9c684 2212}
2213
2214
2215/* Returns the type of an expression with the exception that iterator
2216 variables are automatically integers no matter what else they may
2217 be declared as. */
2218
2219static bt
1a9745d2 2220et0 (gfc_expr *e)
4ee9c684 2221{
60e19868 2222 if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e))
4ee9c684 2223 return BT_INTEGER;
2224
2225 return e->ts.type;
2226}
2227
2228
466078cb 2229/* Scalarize an expression for an elemental intrinsic call. */
2230
60e19868 2231static bool
082b5a23 2232scalarize_intrinsic_call (gfc_expr *e, bool init_flag)
466078cb 2233{
2234 gfc_actual_arglist *a, *b;
126387b5 2235 gfc_constructor_base ctor;
db9cef39 2236 gfc_constructor *args[5] = {}; /* Avoid uninitialized warnings. */
126387b5 2237 gfc_constructor *ci, *new_ctor;
466078cb 2238 gfc_expr *expr, *old;
87f1fed5 2239 int n, i, rank[5], array_arg;
082b5a23 2240 int errors = 0;
2241
2242 if (e == NULL)
2243 return false;
2244
2245 a = e->value.function.actual;
2246 for (; a; a = a->next)
2247 if (a->expr && !gfc_is_constant_expr (a->expr))
2248 return false;
a90fe829 2249
87f1fed5 2250 /* Find which, if any, arguments are arrays. Assume that the old
2251 expression carries the type information and that the first arg
2252 that is an array expression carries all the shape information.*/
2253 n = array_arg = 0;
05db9fcb 2254 a = e->value.function.actual;
87f1fed5 2255 for (; a; a = a->next)
2256 {
2257 n++;
098018e2 2258 if (!a->expr || a->expr->expr_type != EXPR_ARRAY)
87f1fed5 2259 continue;
2260 array_arg = n;
2261 expr = gfc_copy_expr (a->expr);
2262 break;
2263 }
2264
2265 if (!array_arg)
60e19868 2266 return false;
05db9fcb 2267
2268 old = gfc_copy_expr (e);
87f1fed5 2269
126387b5 2270 gfc_constructor_free (expr->value.constructor);
466078cb 2271 expr->value.constructor = NULL;
466078cb 2272 expr->ts = old->ts;
87f1fed5 2273 expr->where = old->where;
466078cb 2274 expr->expr_type = EXPR_ARRAY;
2275
2276 /* Copy the array argument constructors into an array, with nulls
2277 for the scalars. */
2278 n = 0;
2279 a = old->value.function.actual;
2280 for (; a; a = a->next)
2281 {
2282 /* Check that this is OK for an initialization expression. */
082b5a23 2283 if (a->expr && init_flag && !gfc_check_init_expr (a->expr))
466078cb 2284 goto cleanup;
2285
2286 rank[n] = 0;
2287 if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
2288 {
2289 rank[n] = a->expr->rank;
2290 ctor = a->expr->symtree->n.sym->value->value.constructor;
126387b5 2291 args[n] = gfc_constructor_first (ctor);
466078cb 2292 }
2293 else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
2294 {
2295 if (a->expr->rank)
2296 rank[n] = a->expr->rank;
2297 else
2298 rank[n] = 1;
126387b5 2299 ctor = gfc_constructor_copy (a->expr->value.constructor);
2300 args[n] = gfc_constructor_first (ctor);
466078cb 2301 }
2302 else
2303 args[n] = NULL;
126387b5 2304
466078cb 2305 n++;
2306 }
2307
082b5a23 2308 gfc_get_errors (NULL, &errors);
466078cb 2309
05db9fcb 2310 /* Using the array argument as the master, step through the array
466078cb 2311 calling the function for each element and advancing the array
2312 constructors together. */
126387b5 2313 for (ci = args[array_arg - 1]; ci; ci = gfc_constructor_next (ci))
466078cb 2314 {
126387b5 2315 new_ctor = gfc_constructor_append_expr (&expr->value.constructor,
2316 gfc_copy_expr (old), NULL);
2317
2318 gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
2319 a = NULL;
2320 b = old->value.function.actual;
2321 for (i = 0; i < n; i++)
2322 {
2323 if (a == NULL)
2324 new_ctor->expr->value.function.actual
2325 = a = gfc_get_actual_arglist ();
466078cb 2326 else
2327 {
126387b5 2328 a->next = gfc_get_actual_arglist ();
2329 a = a->next;
466078cb 2330 }
466078cb 2331
126387b5 2332 if (args[i])
2333 a->expr = gfc_copy_expr (args[i]->expr);
2334 else
2335 a->expr = gfc_copy_expr (b->expr);
2336
2337 b = b->next;
2338 }
466078cb 2339
126387b5 2340 /* Simplify the function calls. If the simplification fails, the
2341 error will be flagged up down-stream or the library will deal
2342 with it. */
082b5a23 2343 if (errors == 0)
2344 gfc_simplify_expr (new_ctor->expr, 0);
466078cb 2345
126387b5 2346 for (i = 0; i < n; i++)
2347 if (args[i])
2348 args[i] = gfc_constructor_next (args[i]);
466078cb 2349
126387b5 2350 for (i = 1; i < n; i++)
2351 if (rank[i] && ((args[i] != NULL && args[array_arg - 1] == NULL)
2352 || (args[i] == NULL && args[array_arg - 1] != NULL)))
2353 goto compliance;
466078cb 2354 }
2355
2356 free_expr0 (e);
2357 *e = *expr;
1f947744 2358 /* Free "expr" but not the pointers it contains. */
2359 free (expr);
466078cb 2360 gfc_free_expr (old);
60e19868 2361 return true;
466078cb 2362
2363compliance:
2364 gfc_error_now ("elemental function arguments at %C are not compliant");
2365
2366cleanup:
2367 gfc_free_expr (expr);
2368 gfc_free_expr (old);
60e19868 2369 return false;
466078cb 2370}
2371
2372
60e19868 2373static bool
2374check_intrinsic_op (gfc_expr *e, bool (*check_function) (gfc_expr *))
4ee9c684 2375{
9b773341 2376 gfc_expr *op1 = e->value.op.op1;
2377 gfc_expr *op2 = e->value.op.op2;
4ee9c684 2378
60e19868 2379 if (!(*check_function)(op1))
2380 return false;
4ee9c684 2381
dcb1b019 2382 switch (e->value.op.op)
4ee9c684 2383 {
2384 case INTRINSIC_UPLUS:
2385 case INTRINSIC_UMINUS:
9b773341 2386 if (!numeric_type (et0 (op1)))
4ee9c684 2387 goto not_numeric;
2388 break;
2389
2390 case INTRINSIC_EQ:
f47957c7 2391 case INTRINSIC_EQ_OS:
4ee9c684 2392 case INTRINSIC_NE:
f47957c7 2393 case INTRINSIC_NE_OS:
4ee9c684 2394 case INTRINSIC_GT:
f47957c7 2395 case INTRINSIC_GT_OS:
4ee9c684 2396 case INTRINSIC_GE:
f47957c7 2397 case INTRINSIC_GE_OS:
4ee9c684 2398 case INTRINSIC_LT:
f47957c7 2399 case INTRINSIC_LT_OS:
4ee9c684 2400 case INTRINSIC_LE:
f47957c7 2401 case INTRINSIC_LE_OS:
60e19868 2402 if (!(*check_function)(op2))
2403 return false;
a90fe829 2404
9b773341 2405 if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
2406 && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
8e77051c 2407 {
2408 gfc_error ("Numeric or CHARACTER operands are required in "
2409 "expression at %L", &e->where);
60e19868 2410 return false;
8e77051c 2411 }
2412 break;
4ee9c684 2413
2414 case INTRINSIC_PLUS:
2415 case INTRINSIC_MINUS:
2416 case INTRINSIC_TIMES:
2417 case INTRINSIC_DIVIDE:
2418 case INTRINSIC_POWER:
60e19868 2419 if (!(*check_function)(op2))
2420 return false;
4ee9c684 2421
9b773341 2422 if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
4ee9c684 2423 goto not_numeric;
2424
4ee9c684 2425 break;
2426
2427 case INTRINSIC_CONCAT:
60e19868 2428 if (!(*check_function)(op2))
2429 return false;
4ee9c684 2430
9b773341 2431 if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
4ee9c684 2432 {
2433 gfc_error ("Concatenation operator in expression at %L "
9b773341 2434 "must have two CHARACTER operands", &op1->where);
60e19868 2435 return false;
4ee9c684 2436 }
2437
9b773341 2438 if (op1->ts.kind != op2->ts.kind)
4ee9c684 2439 {
2440 gfc_error ("Concat operator at %L must concatenate strings of the "
2441 "same kind", &e->where);
60e19868 2442 return false;
4ee9c684 2443 }
2444
2445 break;
2446
2447 case INTRINSIC_NOT:
9b773341 2448 if (et0 (op1) != BT_LOGICAL)
4ee9c684 2449 {
2450 gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
9b773341 2451 "operand", &op1->where);
60e19868 2452 return false;
4ee9c684 2453 }
2454
2455 break;
2456
2457 case INTRINSIC_AND:
2458 case INTRINSIC_OR:
2459 case INTRINSIC_EQV:
2460 case INTRINSIC_NEQV:
60e19868 2461 if (!(*check_function)(op2))
2462 return false;
4ee9c684 2463
9b773341 2464 if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
4ee9c684 2465 {
2466 gfc_error ("LOGICAL operands are required in expression at %L",
2467 &e->where);
60e19868 2468 return false;
4ee9c684 2469 }
2470
2471 break;
2472
9bdc6bfa 2473 case INTRINSIC_PARENTHESES:
2474 break;
2475
4ee9c684 2476 default:
2477 gfc_error ("Only intrinsic operators can be used in expression at %L",
2478 &e->where);
60e19868 2479 return false;
4ee9c684 2480 }
2481
60e19868 2482 return true;
4ee9c684 2483
2484not_numeric:
2485 gfc_error ("Numeric operands are required in expression at %L", &e->where);
2486
60e19868 2487 return false;
4ee9c684 2488}
2489
0c54ae75 2490/* F2003, 7.1.7 (3): In init expression, allocatable components
2491 must not be data-initialized. */
60e19868 2492static bool
0c54ae75 2493check_alloc_comp_init (gfc_expr *e)
2494{
126387b5 2495 gfc_component *comp;
0c54ae75 2496 gfc_constructor *ctor;
2497
2498 gcc_assert (e->expr_type == EXPR_STRUCTURE);
a3ba9d54 2499 gcc_assert (e->ts.type == BT_DERIVED || e->ts.type == BT_CLASS);
0c54ae75 2500
126387b5 2501 for (comp = e->ts.u.derived->components,
2502 ctor = gfc_constructor_first (e->value.constructor);
2503 comp; comp = comp->next, ctor = gfc_constructor_next (ctor))
0c54ae75 2504 {
cc7db007 2505 if (comp->attr.allocatable && ctor->expr
0c54ae75 2506 && ctor->expr->expr_type != EXPR_NULL)
2507 {
716da296 2508 gfc_error ("Invalid initialization expression for ALLOCATABLE "
2509 "component %qs in structure constructor at %L",
2510 comp->name, &ctor->expr->where);
60e19868 2511 return false;
0c54ae75 2512 }
2513 }
2514
60e19868 2515 return true;
0c54ae75 2516}
4ee9c684 2517
f8493bd2 2518static match
2519check_init_expr_arguments (gfc_expr *e)
2520{
2521 gfc_actual_arglist *ap;
4ee9c684 2522
f8493bd2 2523 for (ap = e->value.function.actual; ap; ap = ap->next)
60e19868 2524 if (!gfc_check_init_expr (ap->expr))
f8493bd2 2525 return MATCH_ERROR;
4ee9c684 2526
f8493bd2 2527 return MATCH_YES;
2528}
2529
60e19868 2530static bool check_restricted (gfc_expr *);
02ceaa6d 2531
f8493bd2 2532/* F95, 7.1.6.1, Initialization expressions, (7)
bc3eb257 2533 F2003, 7.1.7 Initialization expression, (8)
2534 F2008, 7.1.12 Constant expression, (4) */
f8493bd2 2535
2536static match
1a9745d2 2537check_inquiry (gfc_expr *e, int not_restricted)
4ee9c684 2538{
2539 const char *name;
f8493bd2 2540 const char *const *functions;
2541
2542 static const char *const inquiry_func_f95[] = {
2543 "lbound", "shape", "size", "ubound",
2544 "bit_size", "len", "kind",
2545 "digits", "epsilon", "huge", "maxexponent", "minexponent",
2546 "precision", "radix", "range", "tiny",
2547 NULL
2548 };
4ee9c684 2549
f8493bd2 2550 static const char *const inquiry_func_f2003[] = {
2551 "lbound", "shape", "size", "ubound",
2552 "bit_size", "len", "kind",
2553 "digits", "epsilon", "huge", "maxexponent", "minexponent",
2554 "precision", "radix", "range", "tiny",
2555 "new_line", NULL
4ee9c684 2556 };
2557
bc3eb257 2558 /* std=f2008+ or -std=gnu */
2559 static const char *const inquiry_func_gnu[] = {
2560 "lbound", "shape", "size", "ubound",
2561 "bit_size", "len", "kind",
2562 "digits", "epsilon", "huge", "maxexponent", "minexponent",
2563 "precision", "radix", "range", "tiny",
2564 "new_line", "storage_size", NULL
2565 };
2566
07f0c434 2567 int i = 0;
f8493bd2 2568 gfc_actual_arglist *ap;
2569
2570 if (!e->value.function.isym
2571 || !e->value.function.isym->inquiry)
2572 return MATCH_NO;
4ee9c684 2573
0c989284 2574 /* An undeclared parameter will get us here (PR25018). */
2575 if (e->symtree == NULL)
f8493bd2 2576 return MATCH_NO;
0c989284 2577
07f0c434 2578 if (e->symtree->n.sym->from_intmod)
2579 {
2580 if (e->symtree->n.sym->from_intmod == INTMOD_ISO_FORTRAN_ENV
2581 && e->symtree->n.sym->intmod_sym_id != ISOFORTRAN_COMPILER_OPTIONS
2582 && e->symtree->n.sym->intmod_sym_id != ISOFORTRAN_COMPILER_VERSION)
2583 return MATCH_NO;
4ee9c684 2584
07f0c434 2585 if (e->symtree->n.sym->from_intmod == INTMOD_ISO_C_BINDING
2586 && e->symtree->n.sym->intmod_sym_id != ISOCBINDING_C_SIZEOF)
2587 return MATCH_NO;
2588 }
2589 else
2590 {
2591 name = e->symtree->n.sym->name;
2592
bc3eb257 2593 functions = inquiry_func_gnu;
2594 if (gfc_option.warn_std & GFC_STD_F2003)
2595 functions = inquiry_func_f2003;
2596 if (gfc_option.warn_std & GFC_STD_F95)
2597 functions = inquiry_func_f95;
4ee9c684 2598
07f0c434 2599 for (i = 0; functions[i]; i++)
2600 if (strcmp (functions[i], name) == 0)
2601 break;
4ee9c684 2602
5c6f6a61 2603 if (functions[i] == NULL)
2604 return MATCH_ERROR;
07f0c434 2605 }
4ee9c684 2606
ec7d1569 2607 /* At this point we have an inquiry function with a variable argument. The
2608 type of the variable might be undefined, but we need it now, because the
f8493bd2 2609 arguments of these functions are not allowed to be undefined. */
4ee9c684 2610
f8493bd2 2611 for (ap = e->value.function.actual; ap; ap = ap->next)
4ee9c684 2612 {
f8493bd2 2613 if (!ap->expr)
2614 continue;
2615
2616 if (ap->expr->ts.type == BT_UNKNOWN)
2617 {
2618 if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
60e19868 2619 && !gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns))
f8493bd2 2620 return MATCH_NO;
4ee9c684 2621
f8493bd2 2622 ap->expr->ts = ap->expr->symtree->n.sym->ts;
2623 }
2624
2625 /* Assumed character length will not reduce to a constant expression
2626 with LEN, as required by the standard. */
a6a9db02 2627 if (i == 5 && not_restricted && ap->expr->symtree
f8493bd2 2628 && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
3e715c81 2629 && (ap->expr->symtree->n.sym->ts.u.cl->length == NULL
2630 || ap->expr->symtree->n.sym->ts.deferred))
f8493bd2 2631 {
716da296 2632 gfc_error ("Assumed or deferred character length variable %qs "
1b7008c4 2633 "in constant expression at %L",
3e715c81 2634 ap->expr->symtree->n.sym->name,
2635 &ap->expr->where);
f8493bd2 2636 return MATCH_ERROR;
2637 }
60e19868 2638 else if (not_restricted && !gfc_check_init_expr (ap->expr))
f8493bd2 2639 return MATCH_ERROR;
02ceaa6d 2640
2641 if (not_restricted == 0
2642 && ap->expr->expr_type != EXPR_VARIABLE
60e19868 2643 && !check_restricted (ap->expr))
02ceaa6d 2644 return MATCH_ERROR;
91e5619b 2645
2646 if (not_restricted == 0
2647 && ap->expr->expr_type == EXPR_VARIABLE
2648 && ap->expr->symtree->n.sym->attr.dummy
2649 && ap->expr->symtree->n.sym->attr.optional)
2650 return MATCH_NO;
4ee9c684 2651 }
2652
f8493bd2 2653 return MATCH_YES;
2654}
2655
0c989284 2656
f8493bd2 2657/* F95, 7.1.6.1, Initialization expressions, (5)
2658 F2003, 7.1.7 Initialization expression, (5) */
2659
2660static match
2661check_transformational (gfc_expr *e)
2662{
2663 static const char * const trans_func_f95[] = {
2664 "repeat", "reshape", "selected_int_kind",
2665 "selected_real_kind", "transfer", "trim", NULL
2666 };
2667
2702253a 2668 static const char * const trans_func_f2003[] = {
9a94ba56 2669 "all", "any", "count", "dot_product", "matmul", "null", "pack",
2670 "product", "repeat", "reshape", "selected_char_kind", "selected_int_kind",
7a236826 2671 "selected_real_kind", "spread", "sum", "transfer", "transpose",
2672 "trim", "unpack", NULL
2702253a 2673 };
2674
b17c03a4 2675 static const char * const trans_func_f2008[] = {
2676 "all", "any", "count", "dot_product", "matmul", "null", "pack",
2677 "product", "repeat", "reshape", "selected_char_kind", "selected_int_kind",
2678 "selected_real_kind", "spread", "sum", "transfer", "transpose",
2679 "trim", "unpack", "findloc", NULL
2680 };
2681
f8493bd2 2682 int i;
2683 const char *name;
2702253a 2684 const char *const *functions;
f8493bd2 2685
2686 if (!e->value.function.isym
2687 || !e->value.function.isym->transformational)
2688 return MATCH_NO;
2689
2690 name = e->symtree->n.sym->name;
2691
b17c03a4 2692 if (gfc_option.allow_std & GFC_STD_F2008)
2693 functions = trans_func_f2008;
2694 else if (gfc_option.allow_std & GFC_STD_F2003)
2695 functions = trans_func_f2003;
2696 else
2697 functions = trans_func_f95;
2702253a 2698
f8493bd2 2699 /* NULL() is dealt with below. */
2700 if (strcmp ("null", name) == 0)
2701 return MATCH_NO;
2702
2702253a 2703 for (i = 0; functions[i]; i++)
2704 if (strcmp (functions[i], name) == 0)
2705 break;
f8493bd2 2706
2702253a 2707 if (functions[i] == NULL)
01c4a808 2708 {
716da296 2709 gfc_error ("transformational intrinsic %qs at %L is not permitted "
2710 "in an initialization expression", name, &e->where);
01c4a808 2711 return MATCH_ERROR;
2712 }
f8493bd2 2713
2714 return check_init_expr_arguments (e);
2715}
2716
2717
2718/* F95, 7.1.6.1, Initialization expressions, (6)
2719 F2003, 7.1.7 Initialization expression, (6) */
2720
2721static match
2722check_null (gfc_expr *e)
2723{
2724 if (strcmp ("null", e->symtree->n.sym->name) != 0)
2725 return MATCH_NO;
2726
2727 return check_init_expr_arguments (e);
2728}
2729
2730
2731static match
2732check_elemental (gfc_expr *e)
2733{
2734 if (!e->value.function.isym
2735 || !e->value.function.isym->elemental)
2736 return MATCH_NO;
2737
769e92a1 2738 if (e->ts.type != BT_INTEGER
2739 && e->ts.type != BT_CHARACTER
60e19868 2740 && !gfc_notify_std (GFC_STD_F2003, "Evaluation of nonstandard "
2741 "initialization expression at %L", &e->where))
f8493bd2 2742 return MATCH_ERROR;
2743
2744 return check_init_expr_arguments (e);
2745}
2746
2747
2748static match
2749check_conversion (gfc_expr *e)
2750{
2751 if (!e->value.function.isym
2752 || !e->value.function.isym->conversion)
2753 return MATCH_NO;
2754
2755 return check_init_expr_arguments (e);
4ee9c684 2756}
2757
2758
2759/* Verify that an expression is an initialization expression. A side
2760 effect is that the expression tree is reduced to a single constant
2761 node if all goes well. This would normally happen when the
2762 expression is constructed but function references are assumed to be
2763 intrinsics in the context of initialization expressions. If
60e19868 2764 false is returned an error message has been generated. */
4ee9c684 2765
60e19868 2766bool
bc70e8cf 2767gfc_check_init_expr (gfc_expr *e)
4ee9c684 2768{
4ee9c684 2769 match m;
60e19868 2770 bool t;
4ee9c684 2771
2772 if (e == NULL)
60e19868 2773 return true;
4ee9c684 2774
2775 switch (e->expr_type)
2776 {
2777 case EXPR_OP:
bc70e8cf 2778 t = check_intrinsic_op (e, gfc_check_init_expr);
60e19868 2779 if (t)
4ee9c684 2780 t = gfc_simplify_expr (e, 0);
2781
2782 break;
2783
2784 case EXPR_FUNCTION:
60e19868 2785 t = false;
466078cb 2786
3ac13aae 2787 {
de545baf 2788 bool conversion;
2789 gfc_intrinsic_sym* isym = NULL;
d566c3e0 2790 gfc_symbol* sym = e->symtree->n.sym;
2791
9f1638d5 2792 /* Simplify here the intrinsics from the IEEE_ARITHMETIC and
2793 IEEE_EXCEPTIONS modules. */
2794 int mod = sym->from_intmod;
2795 if (mod == INTMOD_NONE && sym->generic)
2796 mod = sym->generic->sym->from_intmod;
2797 if (mod == INTMOD_IEEE_ARITHMETIC || mod == INTMOD_IEEE_EXCEPTIONS)
d566c3e0 2798 {
9f1638d5 2799 gfc_expr *new_expr = gfc_simplify_ieee_functions (e);
d566c3e0 2800 if (new_expr)
2801 {
2802 gfc_replace_expr (e, new_expr);
2803 t = true;
2804 break;
2805 }
2806 }
a34926ba 2807
de545baf 2808 /* If a conversion function, e.g., __convert_i8_i4, was inserted
2809 into an array constructor, we need to skip the error check here.
2810 Conversion errors are caught below in scalarize_intrinsic_call. */
2811 conversion = e->value.function.isym
2812 && (e->value.function.isym->conversion == 1);
2813
2814 if (!conversion && (!gfc_is_intrinsic (sym, 0, e->where)
2815 || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES))
3ac13aae 2816 {
716da296 2817 gfc_error ("Function %qs in initialization expression at %L "
3ac13aae 2818 "must be an intrinsic function",
2819 e->symtree->n.sym->name, &e->where);
2820 break;
2821 }
4ee9c684 2822
3ac13aae 2823 if ((m = check_conversion (e)) == MATCH_NO
2824 && (m = check_inquiry (e, 1)) == MATCH_NO
2825 && (m = check_null (e)) == MATCH_NO
2826 && (m = check_transformational (e)) == MATCH_NO
2827 && (m = check_elemental (e)) == MATCH_NO)
2828 {
716da296 2829 gfc_error ("Intrinsic function %qs at %L is not permitted "
3ac13aae 2830 "in an initialization expression",
2831 e->symtree->n.sym->name, &e->where);
2832 m = MATCH_ERROR;
2833 }
4ee9c684 2834
764ede1f 2835 if (m == MATCH_ERROR)
60e19868 2836 return false;
764ede1f 2837
3ac13aae 2838 /* Try to scalarize an elemental intrinsic function that has an
2839 array argument. */
2840 isym = gfc_find_function (e->symtree->n.sym->name);
2841 if (isym && isym->elemental
082b5a23 2842 && (t = scalarize_intrinsic_call (e, true)))
3ac13aae 2843 break;
2844 }
4ee9c684 2845
f8493bd2 2846 if (m == MATCH_YES)
f38e9908 2847 t = gfc_simplify_expr (e, 0);
f8493bd2 2848
4ee9c684 2849 break;
2850
2851 case EXPR_VARIABLE:
60e19868 2852 t = true;
4ee9c684 2853
9d958d5b 2854 /* This occurs when parsing pdt templates. */
87a0366f 2855 if (gfc_expr_attr (e).pdt_kind)
9d958d5b 2856 break;
2857
60e19868 2858 if (gfc_check_iter_variable (e))
4ee9c684 2859 break;
2860
2861 if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2862 {
6275b2df 2863 /* A PARAMETER shall not be used to define itself, i.e.
2864 REAL, PARAMETER :: x = transfer(0, x)
2865 is invalid. */
2866 if (!e->symtree->n.sym->value)
2867 {
716da296 2868 gfc_error ("PARAMETER %qs is used at %L before its definition "
2869 "is complete", e->symtree->n.sym->name, &e->where);
60e19868 2870 t = false;
6275b2df 2871 }
2872 else
2873 t = simplify_parameter_variable (e, 0);
2874
4ee9c684 2875 break;
2876 }
2877
1bfea7e8 2878 if (gfc_in_match_data ())
2879 break;
2880
60e19868 2881 t = false;
f8493bd2 2882
2883 if (e->symtree->n.sym->as)
2884 {
2885 switch (e->symtree->n.sym->as->type)
2886 {
2887 case AS_ASSUMED_SIZE:
716da296 2888 gfc_error ("Assumed size array %qs at %L is not permitted "
f8493bd2 2889 "in an initialization expression",
2890 e->symtree->n.sym->name, &e->where);
01c4a808 2891 break;
f8493bd2 2892
2893 case AS_ASSUMED_SHAPE:
716da296 2894 gfc_error ("Assumed shape array %qs at %L is not permitted "
f8493bd2 2895 "in an initialization expression",
2896 e->symtree->n.sym->name, &e->where);
01c4a808 2897 break;
f8493bd2 2898
2899 case AS_DEFERRED:
87a2eca6 2900 if (!e->symtree->n.sym->attr.allocatable
2901 && !e->symtree->n.sym->attr.pointer
2902 && e->symtree->n.sym->attr.dummy)
2903 gfc_error ("Assumed-shape array %qs at %L is not permitted "
2904 "in an initialization expression",
2905 e->symtree->n.sym->name, &e->where);
2906 else
2907 gfc_error ("Deferred array %qs at %L is not permitted "
2908 "in an initialization expression",
2909 e->symtree->n.sym->name, &e->where);
01c4a808 2910 break;
f8493bd2 2911
6275b2df 2912 case AS_EXPLICIT:
716da296 2913 gfc_error ("Array %qs at %L is a variable, which does "
6275b2df 2914 "not reduce to a constant expression",
2915 e->symtree->n.sym->name, &e->where);
2916 break;
2917
f8493bd2 2918 default:
2919 gcc_unreachable();
2920 }
2921 }
2922 else
716da296 2923 gfc_error ("Parameter %qs at %L has not been declared or is "
f8493bd2 2924 "a variable, which does not reduce to a constant "
2c78bdd5 2925 "expression", e->symtree->name, &e->where);
f8493bd2 2926
4ee9c684 2927 break;
2928
2929 case EXPR_CONSTANT:
2930 case EXPR_NULL:
60e19868 2931 t = true;
4ee9c684 2932 break;
2933
2934 case EXPR_SUBSTRING:
be0fbcfb 2935 if (e->ref)
2936 {
2937 t = gfc_check_init_expr (e->ref->u.ss.start);
2938 if (!t)
2939 break;
4ee9c684 2940
be0fbcfb 2941 t = gfc_check_init_expr (e->ref->u.ss.end);
2942 if (t)
2943 t = gfc_simplify_expr (e, 0);
2944 }
2945 else
2946 t = false;
4ee9c684 2947 break;
2948
2949 case EXPR_STRUCTURE:
60e19868 2950 t = e->ts.is_iso_c ? true : false;
2951 if (t)
0c54ae75 2952 break;
2953
2954 t = check_alloc_comp_init (e);
60e19868 2955 if (!t)
0c54ae75 2956 break;
2957
bc70e8cf 2958 t = gfc_check_constructor (e, gfc_check_init_expr);
60e19868 2959 if (!t)
0c54ae75 2960 break;
2961
4ee9c684 2962 break;
2963
2964 case EXPR_ARRAY:
bc70e8cf 2965 t = gfc_check_constructor (e, gfc_check_init_expr);
60e19868 2966 if (!t)
4ee9c684 2967 break;
2968
58b069a0 2969 t = gfc_expand_constructor (e, true);
60e19868 2970 if (!t)
4ee9c684 2971 break;
2972
2973 t = gfc_check_constructor_type (e);
2974 break;
2975
2976 default:
2977 gfc_internal_error ("check_init_expr(): Unknown expression type");
2978 }
2979
2980 return t;
2981}
2982
f1095c66 2983/* Reduces a general expression to an initialization expression (a constant).
2984 This used to be part of gfc_match_init_expr.
60e19868 2985 Note that this function doesn't free the given expression on false. */
4ee9c684 2986
60e19868 2987bool
f1095c66 2988gfc_reduce_init_expr (gfc_expr *expr)
4ee9c684 2989{
60e19868 2990 bool t;
4ee9c684 2991
148aaa7f 2992 gfc_init_expr_flag = true;
4ee9c684 2993 t = gfc_resolve_expr (expr);
60e19868 2994 if (t)
bc70e8cf 2995 t = gfc_check_init_expr (expr);
148aaa7f 2996 gfc_init_expr_flag = false;
4ee9c684 2997
60e19868 2998 if (!t)
2999 return false;
4ee9c684 3000
c315461d 3001 if (expr->expr_type == EXPR_ARRAY)
0c989284 3002 {
60e19868 3003 if (!gfc_check_constructor_type (expr))
3004 return false;
3005 if (!gfc_expand_constructor (expr, true))
3006 return false;
f1095c66 3007 }
3008
60e19868 3009 return true;
f1095c66 3010}
3011
3012
3013/* Match an initialization expression. We work by first matching an
148aaa7f 3014 expression, then reducing it to a constant. */
f1095c66 3015
3016match
3017gfc_match_init_expr (gfc_expr **result)
3018{
3019 gfc_expr *expr;
3020 match m;
60e19868 3021 bool t;
f1095c66 3022
3023 expr = NULL;
3024
148aaa7f 3025 gfc_init_expr_flag = true;
786b9ac5 3026
f1095c66 3027 m = gfc_match_expr (&expr);
3028 if (m != MATCH_YES)
786b9ac5 3029 {
148aaa7f 3030 gfc_init_expr_flag = false;
786b9ac5 3031 return m;
3032 }
f1095c66 3033
9d958d5b 3034 if (gfc_derived_parameter_expr (expr))
3035 {
3036 *result = expr;
3037 gfc_init_expr_flag = false;
3038 return m;
3039 }
3040
f1095c66 3041 t = gfc_reduce_init_expr (expr);
60e19868 3042 if (!t)
f1095c66 3043 {
3044 gfc_free_expr (expr);
148aaa7f 3045 gfc_init_expr_flag = false;
0c989284 3046 return MATCH_ERROR;
3047 }
4ee9c684 3048
3049 *result = expr;
148aaa7f 3050 gfc_init_expr_flag = false;
4ee9c684 3051
3052 return MATCH_YES;
3053}
3054
3055
4ee9c684 3056/* Given an actual argument list, test to see that each argument is a
3057 restricted expression and optionally if the expression type is
3058 integer or character. */
3059
60e19868 3060static bool
1a9745d2 3061restricted_args (gfc_actual_arglist *a)
4ee9c684 3062{
4ee9c684 3063 for (; a; a = a->next)
3064 {
60e19868 3065 if (!check_restricted (a->expr))
3066 return false;
4ee9c684 3067 }
3068
60e19868 3069 return true;
4ee9c684 3070}
3071
3072
3073/************* Restricted/specification expressions *************/
3074
3075
3971fdfe 3076/* Make sure a non-intrinsic function is a specification function,
3077 * see F08:7.1.11.5. */
4ee9c684 3078
60e19868 3079static bool
1a9745d2 3080external_spec_function (gfc_expr *e)
4ee9c684 3081{
3082 gfc_symbol *f;
3083
3084 f = e->value.function.esym;
3085
9f1638d5 3086 /* IEEE functions allowed are "a reference to a transformational function
3087 from the intrinsic module IEEE_ARITHMETIC or IEEE_EXCEPTIONS", and
3088 "inquiry function from the intrinsic modules IEEE_ARITHMETIC and
3089 IEEE_EXCEPTIONS". */
3090 if (f->from_intmod == INTMOD_IEEE_ARITHMETIC
3091 || f->from_intmod == INTMOD_IEEE_EXCEPTIONS)
3092 {
3093 if (!strcmp (f->name, "ieee_selected_real_kind")
3094 || !strcmp (f->name, "ieee_support_rounding")
3095 || !strcmp (f->name, "ieee_support_flag")
3096 || !strcmp (f->name, "ieee_support_halting")
3097 || !strcmp (f->name, "ieee_support_datatype")
3098 || !strcmp (f->name, "ieee_support_denormal")
1f957e93 3099 || !strcmp (f->name, "ieee_support_subnormal")
9f1638d5 3100 || !strcmp (f->name, "ieee_support_divide")
3101 || !strcmp (f->name, "ieee_support_inf")
3102 || !strcmp (f->name, "ieee_support_io")
3103 || !strcmp (f->name, "ieee_support_nan")
3104 || !strcmp (f->name, "ieee_support_sqrt")
3105 || !strcmp (f->name, "ieee_support_standard")
3106 || !strcmp (f->name, "ieee_support_underflow_control"))
3107 goto function_allowed;
3108 }
3109
4ee9c684 3110 if (f->attr.proc == PROC_ST_FUNCTION)
3111 {
716da296 3112 gfc_error ("Specification function %qs at %L cannot be a statement "
4ee9c684 3113 "function", f->name, &e->where);
60e19868 3114 return false;
4ee9c684 3115 }
3116
3117 if (f->attr.proc == PROC_INTERNAL)
3118 {
716da296 3119 gfc_error ("Specification function %qs at %L cannot be an internal "
4ee9c684 3120 "function", f->name, &e->where);
60e19868 3121 return false;
4ee9c684 3122 }
3123
6658f183 3124 if (!f->attr.pure && !f->attr.elemental)
4ee9c684 3125 {
716da296 3126 gfc_error ("Specification function %qs at %L must be PURE", f->name,
4ee9c684 3127 &e->where);
60e19868 3128 return false;
4ee9c684 3129 }
3130
c2ee4354 3131 /* F08:7.1.11.6. */
3132 if (f->attr.recursive
3133 && !gfc_notify_std (GFC_STD_F2003,
1b7008c4 3134 "Specification function %qs "
c2ee4354 3135 "at %L cannot be RECURSIVE", f->name, &e->where))
60e19868 3136 return false;
4ee9c684 3137
9f1638d5 3138function_allowed:
e68b1600 3139 return restricted_args (e->value.function.actual);
4ee9c684 3140}
3141
3142
3143/* Check to see that a function reference to an intrinsic is a
e68b1600 3144 restricted expression. */
4ee9c684 3145
60e19868 3146static bool
1a9745d2 3147restricted_intrinsic (gfc_expr *e)
4ee9c684 3148{
e68b1600 3149 /* TODO: Check constraints on inquiry functions. 7.1.6.2 (7). */
f8493bd2 3150 if (check_inquiry (e, 0) == MATCH_YES)
60e19868 3151 return true;
4ee9c684 3152
e68b1600 3153 return restricted_args (e->value.function.actual);
4ee9c684 3154}
3155
3156
ec6db642 3157/* Check the expressions of an actual arglist. Used by check_restricted. */
3158
60e19868 3159static bool
3160check_arglist (gfc_actual_arglist* arg, bool (*checker) (gfc_expr*))
ec6db642 3161{
3162 for (; arg; arg = arg->next)
60e19868 3163 if (!checker (arg->expr))
3164 return false;
ec6db642 3165
60e19868 3166 return true;
ec6db642 3167}
3168
3169
3170/* Check the subscription expressions of a reference chain with a checking
3171 function; used by check_restricted. */
3172
60e19868 3173static bool
3174check_references (gfc_ref* ref, bool (*checker) (gfc_expr*))
ec6db642 3175{
3176 int dim;
3177
3178 if (!ref)
60e19868 3179 return true;
ec6db642 3180
3181 switch (ref->type)
3182 {
3183 case REF_ARRAY:
3184 for (dim = 0; dim != ref->u.ar.dimen; ++dim)
3185 {
60e19868 3186 if (!checker (ref->u.ar.start[dim]))
3187 return false;
3188 if (!checker (ref->u.ar.end[dim]))
3189 return false;
3190 if (!checker (ref->u.ar.stride[dim]))
3191 return false;
ec6db642 3192 }
3193 break;
3194
3195 case REF_COMPONENT:
3196 /* Nothing needed, just proceed to next reference. */
3197 break;
3198
3199 case REF_SUBSTRING:
60e19868 3200 if (!checker (ref->u.ss.start))
3201 return false;
3202 if (!checker (ref->u.ss.end))
3203 return false;
ec6db642 3204 break;
3205
3206 default:
3207 gcc_unreachable ();
3208 break;
3209 }
3210
3211 return check_references (ref->next, checker);
3212}
3213
dcd51ab4 3214/* Return true if ns is a parent of the current ns. */
3215
3216static bool
3217is_parent_of_current_ns (gfc_namespace *ns)
3218{
3219 gfc_namespace *p;
3220 for (p = gfc_current_ns->parent; p; p = p->parent)
3221 if (ns == p)
3222 return true;
3223
3224 return false;
3225}
ec6db642 3226
4ee9c684 3227/* Verify that an expression is a restricted expression. Like its
3228 cousin check_init_expr(), an error message is generated if we
60e19868 3229 return false. */
4ee9c684 3230
60e19868 3231static bool
1a9745d2 3232check_restricted (gfc_expr *e)
4ee9c684 3233{
ec6db642 3234 gfc_symbol* sym;
60e19868 3235 bool t;
4ee9c684 3236
3237 if (e == NULL)
60e19868 3238 return true;
4ee9c684 3239
3240 switch (e->expr_type)
3241 {
3242 case EXPR_OP:
3243 t = check_intrinsic_op (e, check_restricted);
60e19868 3244 if (t)
4ee9c684 3245 t = gfc_simplify_expr (e, 0);
3246
3247 break;
3248
3249 case EXPR_FUNCTION:
ec6db642 3250 if (e->value.function.esym)
3251 {
3252 t = check_arglist (e->value.function.actual, &check_restricted);
60e19868 3253 if (t)
ec6db642 3254 t = external_spec_function (e);
3255 }
3256 else
3257 {
3258 if (e->value.function.isym && e->value.function.isym->inquiry)
60e19868 3259 t = true;
ec6db642 3260 else
3261 t = check_arglist (e->value.function.actual, &check_restricted);
3262
60e19868 3263 if (t)
ec6db642 3264 t = restricted_intrinsic (e);
3265 }
4ee9c684 3266 break;
3267
3268 case EXPR_VARIABLE:
3269 sym = e->symtree->n.sym;
60e19868 3270 t = false;
4ee9c684 3271
a51743b4 3272 /* If a dummy argument appears in a context that is valid for a
3273 restricted expression in an elemental procedure, it will have
3274 already been simplified away once we get here. Therefore we
3275 don't need to jump through hoops to distinguish valid from
3276 invalid cases. */
3277 if (sym->attr.dummy && sym->ns == gfc_current_ns
3278 && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
3279 {
716da296 3280 gfc_error ("Dummy argument %qs not allowed in expression at %L",
a51743b4 3281 sym->name, &e->where);
3282 break;
3283 }
3284
4ee9c684 3285 if (sym->attr.optional)
3286 {
716da296 3287 gfc_error ("Dummy argument %qs at %L cannot be OPTIONAL",
4ee9c684 3288 sym->name, &e->where);
3289 break;
3290 }
3291
3292 if (sym->attr.intent == INTENT_OUT)
3293 {
716da296 3294 gfc_error ("Dummy argument %qs at %L cannot be INTENT(OUT)",
4ee9c684 3295 sym->name, &e->where);
3296 break;
3297 }
3298
ec6db642 3299 /* Check reference chain if any. */
60e19868 3300 if (!check_references (e->ref, &check_restricted))
ec6db642 3301 break;
3302
1a9745d2 3303 /* gfc_is_formal_arg broadcasts that a formal argument list is being
3304 processed in resolve.c(resolve_formal_arglist). This is done so
3305 that host associated dummy array indices are accepted (PR23446).
3306 This mechanism also does the same for the specification expressions
3307 of array-valued functions. */
02ceaa6d 3308 if (e->error
3309 || sym->attr.in_common
3310 || sym->attr.use_assoc
3311 || sym->attr.dummy
3312 || sym->attr.implied_index
ec6db642 3313 || sym->attr.flavor == FL_PARAMETER
dcd51ab4 3314 || is_parent_of_current_ns (sym->ns)
02ceaa6d 3315 || (sym->ns->proc_name != NULL
3316 && sym->ns->proc_name->attr.flavor == FL_MODULE)
3317 || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
4ee9c684 3318 {
60e19868 3319 t = true;
4ee9c684 3320 break;
3321 }
3322
716da296 3323 gfc_error ("Variable %qs cannot appear in the expression at %L",
4ee9c684 3324 sym->name, &e->where);
02ceaa6d 3325 /* Prevent a repetition of the error. */
3326 e->error = 1;
4ee9c684 3327 break;
3328
3329 case EXPR_NULL:
3330 case EXPR_CONSTANT:
60e19868 3331 t = true;
4ee9c684 3332 break;
3333
3334 case EXPR_SUBSTRING:
38d7dddb 3335 t = gfc_specification_expr (e->ref->u.ss.start);
60e19868 3336 if (!t)
4ee9c684 3337 break;
3338
38d7dddb 3339 t = gfc_specification_expr (e->ref->u.ss.end);
60e19868 3340 if (t)
4ee9c684 3341 t = gfc_simplify_expr (e, 0);
3342
3343 break;
3344
3345 case EXPR_STRUCTURE:
3346 t = gfc_check_constructor (e, check_restricted);
3347 break;
3348
3349 case EXPR_ARRAY:
3350 t = gfc_check_constructor (e, check_restricted);
3351 break;
3352
3353 default:
3354 gfc_internal_error ("check_restricted(): Unknown expression type");
3355 }
3356
3357 return t;
3358}
3359
3360
3361/* Check to see that an expression is a specification expression. If
60e19868 3362 we return false, an error has been generated. */
4ee9c684 3363
60e19868 3364bool
1a9745d2 3365gfc_specification_expr (gfc_expr *e)
4ee9c684 3366{
21d5f487 3367 gfc_component *comp;
f6d0e37a 3368
ac42ecbd 3369 if (e == NULL)
60e19868 3370 return true;
4ee9c684 3371
3372 if (e->ts.type != BT_INTEGER)
3373 {
7e221851 3374 gfc_error ("Expression at %L must be of INTEGER type, found %s",
3375 &e->where, gfc_basic_typename (e->ts.type));
60e19868 3376 return false;
4ee9c684 3377 }
3378
b3961d7b 3379 comp = gfc_get_proc_ptr_comp (e);
7c069168 3380 if (e->expr_type == EXPR_FUNCTION
b3961d7b 3381 && !e->value.function.isym
3382 && !e->value.function.esym
3383 && !gfc_pure (e->symtree->n.sym)
3384 && (!comp || !comp->attr.pure))
7c069168 3385 {
716da296 3386 gfc_error ("Function %qs at %L must be PURE",
7c069168 3387 e->symtree->n.sym->name, &e->where);
3388 /* Prevent repeat error messages. */
3389 e->symtree->n.sym->attr.pure = 1;
60e19868 3390 return false;
7c069168 3391 }
3392
4ee9c684 3393 if (e->rank != 0)
3394 {
3395 gfc_error ("Expression at %L must be scalar", &e->where);
60e19868 3396 return false;
4ee9c684 3397 }
3398
60e19868 3399 if (!gfc_simplify_expr (e, 0))
3400 return false;
4ee9c684 3401
3402 return check_restricted (e);
3403}
3404
3405
3406/************** Expression conformance checks. *************/
3407
3408/* Given two expressions, make sure that the arrays are conformable. */
3409
60e19868 3410bool
8828904b 3411gfc_check_conformance (gfc_expr *op1, gfc_expr *op2, const char *optype_msgid, ...)
4ee9c684 3412{
3413 int op1_flag, op2_flag, d;
3414 mpz_t op1_size, op2_size;
60e19868 3415 bool t;
4ee9c684 3416
8828904b 3417 va_list argp;
3418 char buffer[240];
3419
4ee9c684 3420 if (op1->rank == 0 || op2->rank == 0)
60e19868 3421 return true;
4ee9c684 3422
8828904b 3423 va_start (argp, optype_msgid);
3424 vsnprintf (buffer, 240, optype_msgid, argp);
3425 va_end (argp);
3426
4ee9c684 3427 if (op1->rank != op2->rank)
3428 {
8828904b 3429 gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(buffer),
aadb5322 3430 op1->rank, op2->rank, &op1->where);
60e19868 3431 return false;
4ee9c684 3432 }
3433
60e19868 3434 t = true;
4ee9c684 3435
3436 for (d = 0; d < op1->rank; d++)
3437 {
60e19868 3438 op1_flag = gfc_array_dimen_size(op1, d, &op1_size);
3439 op2_flag = gfc_array_dimen_size(op2, d, &op2_size);
4ee9c684 3440
3441 if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
3442 {
b809df7a 3443 gfc_error ("Different shape for %s at %L on dimension %d "
8828904b 3444 "(%d and %d)", _(buffer), &op1->where, d + 1,
41481754 3445 (int) mpz_get_si (op1_size),
4ee9c684 3446 (int) mpz_get_si (op2_size));
3447
60e19868 3448 t = false;
4ee9c684 3449 }
3450
3451 if (op1_flag)
3452 mpz_clear (op1_size);
3453 if (op2_flag)
3454 mpz_clear (op2_size);
3455
60e19868 3456 if (!t)
3457 return false;
4ee9c684 3458 }
3459
60e19868 3460 return true;
4ee9c684 3461}
3462
3463
3464/* Given an assignable expression and an arbitrary expression, make
eee0cf09 3465 sure that the assignment can take place. Only add a call to the intrinsic
3466 conversion routines, when allow_convert is set. When this assign is a
3467 coarray call, then the convert is done by the coarray routine implictly and
3468 adding the intrinsic conversion would do harm in most cases. */
4ee9c684 3469
60e19868 3470bool
eee0cf09 3471gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform,
3472 bool allow_convert)
4ee9c684 3473{
3474 gfc_symbol *sym;
2bec85dc 3475 gfc_ref *ref;
3476 int has_pointer;
4ee9c684 3477
3478 sym = lvalue->symtree->n.sym;
3479
23421d88 3480 /* See if this is the component or subcomponent of a pointer and guard
3481 against assignment to LEN or KIND part-refs. */
2bec85dc 3482 has_pointer = sym->attr.pointer;
2bec85dc 3483 for (ref = lvalue->ref; ref; ref = ref->next)
23421d88 3484 {
3485 if (!has_pointer && ref->type == REF_COMPONENT
3486 && ref->u.c.component->attr.pointer)
3487 has_pointer = 1;
3488 else if (ref->type == REF_INQUIRY
3489 && (ref->u.i == INQUIRY_LEN || ref->u.i == INQUIRY_KIND))
3490 {
3491 gfc_error ("Assignment to a LEN or KIND part_ref at %L is not "
3492 "allowed", &lvalue->where);
3493 return false;
3494 }
3495 }
2bec85dc 3496
f6d0e37a 3497 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
3498 variable local to a function subprogram. Its existence begins when
3499 execution of the function is initiated and ends when execution of the
3500 function is terminated...
3501 Therefore, the left hand side is no longer a variable, when it is: */
1a9745d2 3502 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
3503 && !sym->attr.external)
ecb5283a 3504 {
10b07432 3505 bool bad_proc;
3506 bad_proc = false;
3507
f6d0e37a 3508 /* (i) Use associated; */
10b07432 3509 if (sym->attr.use_assoc)
3510 bad_proc = true;
3511
8e2caf1e 3512 /* (ii) The assignment is in the main program; or */
07914e3e 3513 if (gfc_current_ns->proc_name
3514 && gfc_current_ns->proc_name->attr.is_main_program)
10b07432 3515 bad_proc = true;
3516
f6d0e37a 3517 /* (iii) A module or internal procedure... */
07914e3e 3518 if (gfc_current_ns->proc_name
3519 && (gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
3520 || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
10b07432 3521 && gfc_current_ns->parent
3522 && (!(gfc_current_ns->parent->proc_name->attr.function
1a9745d2 3523 || gfc_current_ns->parent->proc_name->attr.subroutine)
10b07432 3524 || gfc_current_ns->parent->proc_name->attr.is_main_program))
3525 {
a90fe829 3526 /* ... that is not a function... */
07914e3e 3527 if (gfc_current_ns->proc_name
3528 && !gfc_current_ns->proc_name->attr.function)
10b07432 3529 bad_proc = true;
3530
f6d0e37a 3531 /* ... or is not an entry and has a different name. */
10b07432 3532 if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
3533 bad_proc = true;
3534 }
ecb5283a 3535
969664a9 3536 /* (iv) Host associated and not the function symbol or the
3537 parent result. This picks up sibling references, which
3538 cannot be entries. */
3539 if (!sym->attr.entry
3540 && sym->ns == gfc_current_ns->parent
3541 && sym != gfc_current_ns->proc_name
3542 && sym != gfc_current_ns->parent->proc_name->result)
3543 bad_proc = true;
3544
10b07432 3545 if (bad_proc)
3546 {
716da296 3547 gfc_error ("%qs at %L is not a VALUE", sym->name, &lvalue->where);
60e19868 3548 return false;
10b07432 3549 }
3550 }
14103d90 3551 else
3552 {
3553 /* Reject assigning to an external symbol. For initializers, this
3554 was already done before, in resolve_fl_procedure. */
3555 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.external
3556 && sym->attr.proc != PROC_MODULE && !rvalue->error)
3557 {
3558 gfc_error ("Illegal assignment to external procedure at %L",
3559 &lvalue->where);
3560 return false;
3561 }
3562 }
ecb5283a 3563
4ee9c684 3564 if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
3565 {
67647aed 3566 gfc_error ("Incompatible ranks %d and %d in assignment at %L",
3567 lvalue->rank, rvalue->rank, &lvalue->where);
60e19868 3568 return false;
4ee9c684 3569 }
3570
3571 if (lvalue->ts.type == BT_UNKNOWN)
3572 {
3573 gfc_error ("Variable type is UNKNOWN in assignment at %L",
3574 &lvalue->where);
60e19868 3575 return false;
4ee9c684 3576 }
3577
1dda7ad1 3578 if (rvalue->expr_type == EXPR_NULL)
a90fe829 3579 {
95002c27 3580 if (has_pointer && (ref == NULL || ref->next == NULL)
1dda7ad1 3581 && lvalue->symtree->n.sym->attr.data)
60e19868 3582 return true;
1dda7ad1 3583 else
3584 {
3585 gfc_error ("NULL appears on right-hand side in assignment at %L",
3586 &rvalue->where);
60e19868 3587 return false;
1dda7ad1 3588 }
3589 }
67647aed 3590
f6d0e37a 3591 /* This is possibly a typo: x = f() instead of x => f(). */
8290d53f 3592 if (warn_surprising
c44e2519 3593 && rvalue->expr_type == EXPR_FUNCTION && gfc_expr_attr (rvalue).pointer)
4166acc7 3594 gfc_warning (OPT_Wsurprising,
3595 "POINTER-valued function appears on right-hand side of "
fa069004 3596 "assignment at %L", &rvalue->where);
3597
4ee9c684 3598 /* Check size of array assignments. */
3599 if (lvalue->rank != 0 && rvalue->rank != 0
60e19868 3600 && !gfc_check_conformance (lvalue, rvalue, "array assignment"))
3601 return false;
4ee9c684 3602
9ba02d19 3603 if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
3604 && lvalue->symtree->n.sym->attr.data
60e19868 3605 && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L used to "
dd7553fe 3606 "initialize non-integer variable %qs",
60e19868 3607 &rvalue->where, lvalue->symtree->n.sym->name))
3608 return false;
9ba02d19 3609 else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
60e19868 3610 && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L outside "
3611 "a DATA statement and outside INT/REAL/DBLE/CMPLX",
3612 &rvalue->where))
3613 return false;
9ba02d19 3614
3615 /* Handle the case of a BOZ literal on the RHS. */
3616 if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
3617 {
073c96a6 3618 int rc;
8290d53f 3619 if (warn_surprising)
4166acc7 3620 gfc_warning (OPT_Wsurprising,
3621 "BOZ literal at %L is bitwise transferred "
3622 "non-integer symbol %qs", &rvalue->where,
3623 lvalue->symtree->n.sym->name);
cb989427 3624 if (!gfc_convert_boz (rvalue, &lvalue->ts))
60e19868 3625 return false;
073c96a6 3626 if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
3627 {
3628 if (rc == ARITH_UNDERFLOW)
3629 gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
3630 ". This check can be disabled with the option "
0d2b3c9c 3631 "%<-fno-range-check%>", &rvalue->where);
073c96a6 3632 else if (rc == ARITH_OVERFLOW)
3633 gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
3634 ". This check can be disabled with the option "
0d2b3c9c 3635 "%<-fno-range-check%>", &rvalue->where);
073c96a6 3636 else if (rc == ARITH_NAN)
3637 gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
3638 ". This check can be disabled with the option "
0d2b3c9c 3639 "%<-fno-range-check%>", &rvalue->where);
60e19868 3640 return false;
073c96a6 3641 }
9ba02d19 3642 }
3643
9d958d5b 3644 if (gfc_expr_attr (lvalue).pdt_kind || gfc_expr_attr (lvalue).pdt_len)
3645 {
3646 gfc_error ("The assignment to a KIND or LEN component of a "
3647 "parameterized type at %L is not allowed",
3648 &lvalue->where);
3649 return false;
3650 }
3651
4ee9c684 3652 if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
60e19868 3653 return true;
4ee9c684 3654
b84a6ed9 3655 /* Only DATA Statements come here. */
4ee9c684 3656 if (!conform)
3657 {
9d1a574b 3658 locus *where;
3659
169f9d09 3660 /* Numeric can be converted to any other numeric. And Hollerith can be
3661 converted to any other type. */
3662 if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
3663 || rvalue->ts.type == BT_HOLLERITH)
60e19868 3664 return true;
4ee9c684 3665
3f1efd57 3666 if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
60e19868 3667 return true;
3f1efd57 3668
9d1a574b 3669 where = lvalue->where.lb ? &lvalue->where : &rvalue->where;
b84a6ed9 3670 gfc_error ("Incompatible types in DATA statement at %L; attempted "
9d1a574b 3671 "conversion of %s to %s", where,
b84a6ed9 3672 gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
4ee9c684 3673
60e19868 3674 return false;
4ee9c684 3675 }
3676
b44437b9 3677 /* Assignment is the only case where character variables of different
3678 kind values can be converted into one another. */
3679 if (lvalue->ts.type == BT_CHARACTER && rvalue->ts.type == BT_CHARACTER)
3680 {
eee0cf09 3681 if (lvalue->ts.kind != rvalue->ts.kind && allow_convert)
5b40964e 3682 return gfc_convert_chartype (rvalue, &lvalue->ts);
3683 else
3684 return true;
b44437b9 3685 }
3686
eee0cf09 3687 if (!allow_convert)
3688 return true;
3689
4ee9c684 3690 return gfc_convert_type (rvalue, &lvalue->ts, 1);
3691}
3692
3693
3694/* Check that a pointer assignment is OK. We first check lvalue, and
3695 we only check rvalue if it's not an assignment to NULL() or a
3696 NULLIFY statement. */
3697
60e19868 3698bool
14103d90 3699gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue,
dd686aa9 3700 bool suppress_type_test, bool is_init_expr)
4ee9c684 3701{
16f7554b 3702 symbol_attribute attr, lhs_attr;
2bec85dc 3703 gfc_ref *ref;
8b0a2e85 3704 bool is_pure, is_implicit_pure, rank_remap;
7725f40e 3705 int proc_pointer;
4ee9c684 3706
16f7554b 3707 lhs_attr = gfc_expr_attr (lvalue);
3708 if (lvalue->ts.type == BT_UNKNOWN && !lhs_attr.proc_pointer)
4ee9c684 3709 {
3710 gfc_error ("Pointer assignment target is not a POINTER at %L",
3711 &lvalue->where);
60e19868 3712 return false;
4ee9c684 3713 }
3714
16f7554b 3715 if (lhs_attr.flavor == FL_PROCEDURE && lhs_attr.use_assoc
3716 && !lhs_attr.proc_pointer)
ecb5283a 3717 {
716da296 3718 gfc_error ("%qs in the pointer assignment at %L cannot be an "
ecb5283a 3719 "l-value since it is a procedure",
3720 lvalue->symtree->n.sym->name, &lvalue->where);
60e19868 3721 return false;
ecb5283a 3722 }
3723
64e93293 3724 proc_pointer = lvalue->symtree->n.sym->attr.proc_pointer;
2bec85dc 3725
68bf06c3 3726 rank_remap = false;
2bec85dc 3727 for (ref = lvalue->ref; ref; ref = ref->next)
3728 {
81f278c3 3729 if (ref->type == REF_COMPONENT)
7725f40e 3730 proc_pointer = ref->u.c.component->attr.proc_pointer;
eee5eae7 3731
3732 if (ref->type == REF_ARRAY && ref->next == NULL)
3733 {
68bf06c3 3734 int dim;
3735
eee5eae7 3736 if (ref->u.ar.type == AR_FULL)
3737 break;
3738
3739 if (ref->u.ar.type != AR_SECTION)
3740 {
716da296 3741 gfc_error ("Expected bounds specification for %qs at %L",
eee5eae7 3742 lvalue->symtree->n.sym->name, &lvalue->where);
60e19868 3743 return false;
eee5eae7 3744 }
3745
60e19868 3746 if (!gfc_notify_std (GFC_STD_F2003, "Bounds specification "
dd7553fe 3747 "for %qs in pointer assignment at %L",
60e19868 3748 lvalue->symtree->n.sym->name, &lvalue->where))
3749 return false;
eee5eae7 3750
68bf06c3 3751 /* When bounds are given, all lbounds are necessary and either all
3752 or none of the upper bounds; no strides are allowed. If the
3753 upper bounds are present, we may do rank remapping. */
3754 for (dim = 0; dim < ref->u.ar.dimen; ++dim)
3755 {
a1f69dd3 3756 if (!ref->u.ar.start[dim]
3757 || ref->u.ar.dimen_type[dim] != DIMEN_RANGE)
68bf06c3 3758 {
3759 gfc_error ("Lower bound has to be present at %L",
3760 &lvalue->where);
60e19868 3761 return false;
68bf06c3 3762 }
3763 if (ref->u.ar.stride[dim])
3764 {
3765 gfc_error ("Stride must not be present at %L",
3766 &lvalue->where);
60e19868 3767 return false;
68bf06c3 3768 }
3769
3770 if (dim == 0)
3771 rank_remap = (ref->u.ar.end[dim] != NULL);
3772 else
3773 {
3774 if ((rank_remap && !ref->u.ar.end[dim])
3775 || (!rank_remap && ref->u.ar.end[dim]))
3776 {
3777 gfc_error ("Either all or none of the upper bounds"
3778 " must be specified at %L", &lvalue->where);
60e19868 3779 return false;
68bf06c3 3780 }
3781 }
3782 }
eee5eae7 3783 }
2bec85dc 3784 }
3785
4ee9c684 3786 is_pure = gfc_pure (NULL);
8b0a2e85 3787 is_implicit_pure = gfc_implicit_pure (NULL);
4ee9c684 3788
4ee9c684 3789 /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
3790 kind, etc for lvalue and rvalue must match, and rvalue must be a
3791 pure variable if we're in a pure function. */
e4789c62 3792 if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
60e19868 3793 return true;
d7c1b30e 3794
e97ac7c0 3795 /* F2008, C723 (pointer) and C726 (proc-pointer); for PURE also C1283. */
3796 if (lvalue->expr_type == EXPR_VARIABLE
3797 && gfc_is_coindexed (lvalue))
3798 {
3799 gfc_ref *ref;
3800 for (ref = lvalue->ref; ref; ref = ref->next)
3801 if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3802 {
3803 gfc_error ("Pointer object at %L shall not have a coindex",
3804 &lvalue->where);
60e19868 3805 return false;
e97ac7c0 3806 }
3807 }
3808
f6d3042b 3809 /* Checks on rvalue for procedure pointer assignments. */
64e93293 3810 if (proc_pointer)
f6d3042b 3811 {
f92aa4d8 3812 char err[200];
10e9d5ee 3813 gfc_symbol *s1,*s2;
af1b77d0 3814 gfc_component *comp1, *comp2;
10e9d5ee 3815 const char *name;
3816
f6d3042b 3817 attr = gfc_expr_attr (rvalue);
3818 if (!((rvalue->expr_type == EXPR_NULL)
3819 || (rvalue->expr_type == EXPR_FUNCTION && attr.proc_pointer)
64e93293 3820 || (rvalue->expr_type == EXPR_VARIABLE && attr.proc_pointer)
f6d3042b 3821 || (rvalue->expr_type == EXPR_VARIABLE
3822 && attr.flavor == FL_PROCEDURE)))
3823 {
3824 gfc_error ("Invalid procedure pointer assignment at %L",
3825 &rvalue->where);
60e19868 3826 return false;
f6d3042b 3827 }
14103d90 3828
68c6e05c 3829 if (rvalue->expr_type == EXPR_VARIABLE && !attr.proc_pointer)
3830 {
3831 /* Check for intrinsics. */
3832 gfc_symbol *sym = rvalue->symtree->n.sym;
3833 if (!sym->attr.intrinsic
68c6e05c 3834 && (gfc_is_intrinsic (sym, 0, sym->declared_at)
3835 || gfc_is_intrinsic (sym, 1, sym->declared_at)))
3836 {
3837 sym->attr.intrinsic = 1;
3838 gfc_resolve_intrinsic (sym, &rvalue->where);
3839 attr = gfc_expr_attr (rvalue);
3840 }
4925e870 3841 /* Check for result of embracing function. */
07f0c434 3842 if (sym->attr.function && sym->result == sym)
4925e870 3843 {
07f0c434 3844 gfc_namespace *ns;
3845
3846 for (ns = gfc_current_ns; ns; ns = ns->parent)
3847 if (sym == ns->proc_name)
3848 {
716da296 3849 gfc_error ("Function result %qs is invalid as proc-target "
07f0c434 3850 "in procedure pointer assignment at %L",
3851 sym->name, &rvalue->where);
60e19868 3852 return false;
07f0c434 3853 }
4925e870 3854 }
68c6e05c 3855 }
c3e90a10 3856 if (attr.abstract)
3857 {
716da296 3858 gfc_error ("Abstract interface %qs is invalid "
c3e90a10 3859 "in procedure pointer assignment at %L",
3860 rvalue->symtree->name, &rvalue->where);
60e19868 3861 return false;
c3e90a10 3862 }
70e392bb 3863 /* Check for F08:C729. */
9664884e 3864 if (attr.flavor == FL_PROCEDURE)
3865 {
3866 if (attr.proc == PROC_ST_FUNCTION)
3867 {
716da296 3868 gfc_error ("Statement function %qs is invalid "
9664884e 3869 "in procedure pointer assignment at %L",
3870 rvalue->symtree->name, &rvalue->where);
60e19868 3871 return false;
9664884e 3872 }
3873 if (attr.proc == PROC_INTERNAL &&
0d2b3c9c 3874 !gfc_notify_std(GFC_STD_F2008, "Internal procedure %qs "
60e19868 3875 "is invalid in procedure pointer assignment "
3876 "at %L", rvalue->symtree->name, &rvalue->where))
3877 return false;
68c6e05c 3878 if (attr.intrinsic && gfc_intrinsic_actual_ok (rvalue->symtree->name,
3879 attr.subroutine) == 0)
3880 {
716da296 3881 gfc_error ("Intrinsic %qs at %L is invalid in procedure pointer "
68c6e05c 3882 "assignment", rvalue->symtree->name, &rvalue->where);
60e19868 3883 return false;
68c6e05c 3884 }
9664884e 3885 }
70e392bb 3886 /* Check for F08:C730. */
3887 if (attr.elemental && !attr.intrinsic)
3888 {
716da296 3889 gfc_error ("Nonintrinsic elemental procedure %qs is invalid "
ae0426ce 3890 "in procedure pointer assignment at %L",
70e392bb 3891 rvalue->symtree->name, &rvalue->where);
60e19868 3892 return false;
70e392bb 3893 }
36b0a1b0 3894
3895 /* Ensure that the calling convention is the same. As other attributes
3896 such as DLLEXPORT may differ, one explicitly only tests for the
3897 calling conventions. */
3898 if (rvalue->expr_type == EXPR_VARIABLE
3899 && lvalue->symtree->n.sym->attr.ext_attr
3900 != rvalue->symtree->n.sym->attr.ext_attr)
3901 {
0266d75c 3902 symbol_attribute calls;
36b0a1b0 3903
0266d75c 3904 calls.ext_attr = 0;
3905 gfc_add_ext_attribute (&calls, EXT_ATTR_CDECL, NULL);
3906 gfc_add_ext_attribute (&calls, EXT_ATTR_STDCALL, NULL);
3907 gfc_add_ext_attribute (&calls, EXT_ATTR_FASTCALL, NULL);
36b0a1b0 3908
0266d75c 3909 if ((calls.ext_attr & lvalue->symtree->n.sym->attr.ext_attr)
3910 != (calls.ext_attr & rvalue->symtree->n.sym->attr.ext_attr))
36b0a1b0 3911 {
3912 gfc_error ("Mismatch in the procedure pointer assignment "
3913 "at %L: mismatch in the calling convention",
3914 &rvalue->where);
60e19868 3915 return false;
36b0a1b0 3916 }
3917 }
3918
af1b77d0 3919 comp1 = gfc_get_proc_ptr_comp (lvalue);
3920 if (comp1)
3921 s1 = comp1->ts.interface;
10e9d5ee 3922 else
9991edd9 3923 {
3924 s1 = lvalue->symtree->n.sym;
3925 if (s1->ts.interface)
3926 s1 = s1->ts.interface;
3927 }
10e9d5ee 3928
af1b77d0 3929 comp2 = gfc_get_proc_ptr_comp (rvalue);
3930 if (comp2)
10e9d5ee 3931 {
75050d8b 3932 if (rvalue->expr_type == EXPR_FUNCTION)
3933 {
af1b77d0 3934 s2 = comp2->ts.interface->result;
9991edd9 3935 name = s2->name;
75050d8b 3936 }
3937 else
3938 {
af1b77d0 3939 s2 = comp2->ts.interface;
3940 name = comp2->name;
75050d8b 3941 }
10e9d5ee 3942 }
3943 else if (rvalue->expr_type == EXPR_FUNCTION)
3944 {
9d66f5d5 3945 if (rvalue->value.function.esym)
3946 s2 = rvalue->value.function.esym->result;
3947 else
3948 s2 = rvalue->symtree->n.sym->result;
3949
9991edd9 3950 name = s2->name;
10e9d5ee 3951 }
3952 else
3953 {
3954 s2 = rvalue->symtree->n.sym;
9991edd9 3955 name = s2->name;
3956 }
3957
210d1d7e 3958 if (s2 && s2->attr.proc_pointer && s2->ts.interface)
9991edd9 3959 s2 = s2->ts.interface;
3960
af1b77d0 3961 /* Special check for the case of absent interface on the lvalue.
3962 * All other interface checks are done below. */
3963 if (!s1 && comp1 && comp1->attr.subroutine && s2 && s2->attr.function)
3964 {
3965 gfc_error ("Interface mismatch in procedure pointer assignment "
1b7008c4 3966 "at %L: %qs is not a subroutine", &rvalue->where, name);
af1b77d0 3967 return false;
3968 }
3969
b596030c 3970 /* F08:7.2.2.4 (4) */
988e6363 3971 if (s2 && gfc_explicit_interface_required (s2, err, sizeof(err)))
b596030c 3972 {
988e6363 3973 if (comp1 && !s1)
3974 {
3975 gfc_error ("Explicit interface required for component %qs at %L: %s",
3976 comp1->name, &lvalue->where, err);
3977 return false;
3978 }
3979 else if (s1->attr.if_source == IFSRC_UNKNOWN)
3980 {
3981 gfc_error ("Explicit interface required for %qs at %L: %s",
3982 s1->name, &lvalue->where, err);
3983 return false;
3984 }
b596030c 3985 }
988e6363 3986 if (s1 && gfc_explicit_interface_required (s1, err, sizeof(err)))
b596030c 3987 {
988e6363 3988 if (comp2 && !s2)
3989 {
3990 gfc_error ("Explicit interface required for component %qs at %L: %s",
3991 comp2->name, &rvalue->where, err);
3992 return false;
3993 }
3994 else if (s2->attr.if_source == IFSRC_UNKNOWN)
3995 {
3996 gfc_error ("Explicit interface required for %qs at %L: %s",
3997 s2->name, &rvalue->where, err);
3998 return false;
3999 }
b596030c 4000 }
4001
988e6363 4002 if (s1 == s2 || !s1 || !s2)
4003 return true;
4004
9991edd9 4005 if (!gfc_compare_interfaces (s1, s2, name, 0, 1,
4006 err, sizeof(err), NULL, NULL))
4007 {
4008 gfc_error ("Interface mismatch in procedure pointer assignment "
4009 "at %L: %s", &rvalue->where, err);
60e19868 4010 return false;
10e9d5ee 4011 }
4012
77d080ca 4013 /* Check F2008Cor2, C729. */
4014 if (!s2->attr.intrinsic && s2->attr.if_source == IFSRC_UNKNOWN
4015 && !s2->attr.external && !s2->attr.subroutine && !s2->attr.function)
4016 {
716da296 4017 gfc_error ("Procedure pointer target %qs at %L must be either an "
77d080ca 4018 "intrinsic, host or use associated, referenced or have "
4019 "the EXTERNAL attribute", s2->name, &rvalue->where);
4020 return false;
4021 }
4022
60e19868 4023 return true;
f6d3042b 4024 }
14103d90 4025 else
4026 {
4027 /* A non-proc pointer cannot point to a constant. */
4028 if (rvalue->expr_type == EXPR_CONSTANT)
4029 {
4030 gfc_error_now ("Pointer assignment target cannot be a constant at %L",
4031 &rvalue->where);
4032 return false;
4033 }
4034 }
cad0ddcf 4035
cd62bad7 4036 if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
4ee9c684 4037 {
a90fe829 4038 /* Check for F03:C717. */
4039 if (UNLIMITED_POLY (rvalue)
4040 && !(UNLIMITED_POLY (lvalue)
4041 || (lvalue->ts.type == BT_DERIVED
4042 && (lvalue->ts.u.derived->attr.is_bind_c
4043 || lvalue->ts.u.derived->attr.sequence))))
30588018 4044 gfc_error ("Data-pointer-object at %L must be unlimited "
4045 "polymorphic, or of a type with the BIND or SEQUENCE "
4046 "attribute, to be compatible with an unlimited "
4047 "polymorphic target", &lvalue->where);
14103d90 4048 else if (!suppress_type_test)
a90fe829 4049 gfc_error ("Different types in pointer assignment at %L; "
4050 "attempted assignment of %s to %s", &lvalue->where,
4051 gfc_typename (&rvalue->ts),
4052 gfc_typename (&lvalue->ts));
60e19868 4053 return false;
d7c1b30e 4054 }
4ee9c684 4055
1de1b1a9 4056 if (lvalue->ts.type != BT_CLASS && lvalue->ts.kind != rvalue->ts.kind)
d7c1b30e 4057 {
41481754 4058 gfc_error ("Different kind type parameters in pointer "
d7c1b30e 4059 "assignment at %L", &lvalue->where);
60e19868 4060 return false;
d7c1b30e 4061 }
4ee9c684 4062
68bf06c3 4063 if (lvalue->rank != rvalue->rank && !rank_remap)
e4789c62 4064 {
68bf06c3 4065 gfc_error ("Different ranks in pointer assignment at %L", &lvalue->where);
60e19868 4066 return false;
e4789c62 4067 }
4068
25014fa7 4069 /* Make sure the vtab is present. */
4070 if (lvalue->ts.type == BT_CLASS && !UNLIMITED_POLY (rvalue))
4071 gfc_find_vtab (&rvalue->ts);
a97292cb 4072
68bf06c3 4073 /* Check rank remapping. */
4074 if (rank_remap)
4075 {
4076 mpz_t lsize, rsize;
4077
4078 /* If this can be determined, check that the target must be at least as
4079 large as the pointer assigned to it is. */
60e19868 4080 if (gfc_array_size (lvalue, &lsize)
4081 && gfc_array_size (rvalue, &rsize)
68bf06c3 4082 && mpz_cmp (rsize, lsize) < 0)
4083 {
4084 gfc_error ("Rank remapping target is smaller than size of the"
4085 " pointer (%ld < %ld) at %L",
4086 mpz_get_si (rsize), mpz_get_si (lsize),
4087 &lvalue->where);
60e19868 4088 return false;
68bf06c3 4089 }
4090
4091 /* The target must be either rank one or it must be simply contiguous
4092 and F2008 must be allowed. */
4093 if (rvalue->rank != 1)
4094 {
38bb9313 4095 if (!gfc_is_simply_contiguous (rvalue, true, false))
68bf06c3 4096 {
4097 gfc_error ("Rank remapping target must be rank 1 or"
4098 " simply contiguous at %L", &rvalue->where);
60e19868 4099 return false;
68bf06c3 4100 }
60e19868 4101 if (!gfc_notify_std (GFC_STD_F2008, "Rank remapping target is not "
4102 "rank 1 at %L", &rvalue->where))
4103 return false;
68bf06c3 4104 }
4105 }
4106
e4789c62 4107 /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X). */
4108 if (rvalue->expr_type == EXPR_NULL)
60e19868 4109 return true;
e4789c62 4110
9c5786bd 4111 if (lvalue->ts.type == BT_CHARACTER)
ecb5283a 4112 {
60e19868 4113 bool t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment");
4114 if (!t)
4115 return false;
ecb5283a 4116 }
4117
1033248c 4118 if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
4119 lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
4120
d7c1b30e 4121 attr = gfc_expr_attr (rvalue);
7a6b56ac 4122
4123 if (rvalue->expr_type == EXPR_FUNCTION && !attr.pointer)
4124 {
942ef29d 4125 /* F2008, C725. For PURE also C1283. Sometimes rvalue is a function call
4126 to caf_get. Map this to the same error message as below when it is
4127 still a variable expression. */
4128 if (rvalue->value.function.isym
4129 && rvalue->value.function.isym->id == GFC_ISYM_CAF_GET)
4130 /* The test above might need to be extend when F08, Note 5.4 has to be
4131 interpreted in the way that target and pointer with the same coindex
4132 are allowed. */
4133 gfc_error ("Data target at %L shall not have a coindex",
4134 &rvalue->where);
4135 else
4136 gfc_error ("Target expression in pointer assignment "
4137 "at %L must deliver a pointer result",
4138 &rvalue->where);
60e19868 4139 return false;
7a6b56ac 4140 }
4141
dd686aa9 4142 if (is_init_expr)
d7c1b30e 4143 {
dd686aa9 4144 gfc_symbol *sym;
4145 bool target;
4146
4147 gcc_assert (rvalue->symtree);
4148 sym = rvalue->symtree->n.sym;
4149
4150 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
4151 target = CLASS_DATA (sym)->attr.target;
4152 else
4153 target = sym->attr.target;
4154
4155 if (!target && !proc_pointer)
4156 {
4157 gfc_error ("Pointer assignment target in initialization expression "
4158 "does not have the TARGET attribute at %L",
4159 &rvalue->where);
4160 return false;
4161 }
4162 }
4163 else
4164 {
4165 if (!attr.target && !attr.pointer)
4166 {
4167 gfc_error ("Pointer assignment target is neither TARGET "
4168 "nor POINTER at %L", &rvalue->where);
4169 return false;
4170 }
d7c1b30e 4171 }
4ee9c684 4172
d7c1b30e 4173 if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
4174 {
41481754 4175 gfc_error ("Bad target in pointer assignment in PURE "
d7c1b30e 4176 "procedure at %L", &rvalue->where);
4177 }
4ee9c684 4178
8b0a2e85 4179 if (is_implicit_pure && gfc_impure_variable (rvalue->symtree->n.sym))
c77badf3 4180 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
8b0a2e85 4181
c8df3e9c 4182 if (gfc_has_vector_index (rvalue))
4183 {
4184 gfc_error ("Pointer assignment with vector subscript "
4185 "on rhs at %L", &rvalue->where);
60e19868 4186 return false;
c8df3e9c 4187 }
4188
c40fca43 4189 if (attr.is_protected && attr.use_assoc
4190 && !(attr.pointer || attr.proc_pointer))
3ea52af3 4191 {
69b1505f 4192 gfc_error ("Pointer assignment target has PROTECTED "
1a9745d2 4193 "attribute at %L", &rvalue->where);
60e19868 4194 return false;
3ea52af3 4195 }
4196
e97ac7c0 4197 /* F2008, C725. For PURE also C1283. */
4198 if (rvalue->expr_type == EXPR_VARIABLE
4199 && gfc_is_coindexed (rvalue))
4200 {
4201 gfc_ref *ref;
4202 for (ref = rvalue->ref; ref; ref = ref->next)
4203 if (ref->type == REF_ARRAY && ref->u.ar.codimen)
4204 {
4205 gfc_error ("Data target at %L shall not have a coindex",
4206 &rvalue->where);
60e19868 4207 return false;
e97ac7c0 4208 }
4209 }
4210
8614be81 4211 /* Warn for assignments of contiguous pointers to targets which is not
f7f62573 4212 contiguous. Be lenient in the definition of what counts as
2a6d2269 4213 contiguous. */
f7f62573 4214
4215 if (lhs_attr.contiguous && !gfc_is_simply_contiguous (rvalue, false, true))
8614be81 4216 gfc_warning (OPT_Wextra, "Assignment to contiguous pointer from "
4217 "non-contiguous target at %L", &rvalue->where);
f7f62573 4218
38d81530 4219 /* Warn if it is the LHS pointer may lives longer than the RHS target. */
8290d53f 4220 if (warn_target_lifetime
38d81530 4221 && rvalue->expr_type == EXPR_VARIABLE
4222 && !rvalue->symtree->n.sym->attr.save
6d5cf4ea 4223 && !rvalue->symtree->n.sym->attr.pointer && !attr.pointer
4224 && !rvalue->symtree->n.sym->attr.host_assoc
38d81530 4225 && !rvalue->symtree->n.sym->attr.in_common
4226 && !rvalue->symtree->n.sym->attr.use_assoc
4227 && !rvalue->symtree->n.sym->attr.dummy)
4228 {
4229 bool warn;
4230 gfc_namespace *ns;
4231
4232 warn = lvalue->symtree->n.sym->attr.dummy
4233 || lvalue->symtree->n.sym->attr.result
2bf99680 4234 || lvalue->symtree->n.sym->attr.function
d1152041 4235 || (lvalue->symtree->n.sym->attr.host_assoc
4236 && lvalue->symtree->n.sym->ns
4237 != rvalue->symtree->n.sym->ns)
38d81530 4238 || lvalue->symtree->n.sym->attr.use_assoc
4239 || lvalue->symtree->n.sym->attr.in_common;
4240
4241 if (rvalue->symtree->n.sym->ns->proc_name
4242 && rvalue->symtree->n.sym->ns->proc_name->attr.flavor != FL_PROCEDURE
4243 && rvalue->symtree->n.sym->ns->proc_name->attr.flavor != FL_PROGRAM)
4244 for (ns = rvalue->symtree->n.sym->ns;
35366896 4245 ns && ns->proc_name && ns->proc_name->attr.flavor != FL_PROCEDURE;
38d81530 4246 ns = ns->parent)
4247 if (ns->parent == lvalue->symtree->n.sym->ns)
16e3c896 4248 {
4249 warn = true;
4250 break;
4251 }
38d81530 4252
4253 if (warn)
4166acc7 4254 gfc_warning (OPT_Wtarget_lifetime,
4255 "Pointer at %L in pointer assignment might outlive the "
38d81530 4256 "pointer target", &lvalue->where);
4257 }
4258
60e19868 4259 return true;
4ee9c684 4260}
4261
4262
4263/* Relative of gfc_check_assign() except that the lvalue is a single
bda1f152 4264 symbol. Used for initialization assignments. */
4ee9c684 4265
60e19868 4266bool
16f7554b 4267gfc_check_assign_symbol (gfc_symbol *sym, gfc_component *comp, gfc_expr *rvalue)
4ee9c684 4268{
4269 gfc_expr lvalue;
60e19868 4270 bool r;
16f7554b 4271 bool pointer, proc_pointer;
4ee9c684 4272
4273 memset (&lvalue, '\0', sizeof (gfc_expr));
4274
4275 lvalue.expr_type = EXPR_VARIABLE;
4276 lvalue.ts = sym->ts;
4277 if (sym->as)
4278 lvalue.rank = sym->as->rank;
dfa3fb6a 4279 lvalue.symtree = XCNEW (gfc_symtree);
4ee9c684 4280 lvalue.symtree->n.sym = sym;
4281 lvalue.where = sym->declared_at;
4282
16f7554b 4283 if (comp)
4284 {
4285 lvalue.ref = gfc_get_ref ();
4286 lvalue.ref->type = REF_COMPONENT;
4287 lvalue.ref->u.c.component = comp;
4288 lvalue.ref->u.c.sym = sym;
4289 lvalue.ts = comp->ts;
4290 lvalue.rank = comp->as ? comp->as->rank : 0;
4291 lvalue.where = comp->loc;
4292 pointer = comp->ts.type == BT_CLASS && CLASS_DATA (comp)
4293 ? CLASS_DATA (comp)->attr.class_pointer : comp->attr.pointer;
4294 proc_pointer = comp->attr.proc_pointer;
4295 }
4296 else
4297 {
4298 pointer = sym->ts.type == BT_CLASS && CLASS_DATA (sym)
4299 ? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer;
4300 proc_pointer = sym->attr.proc_pointer;
4301 }
4302
4303 if (pointer || proc_pointer)
dd686aa9 4304 r = gfc_check_pointer_assign (&lvalue, rvalue, false, true);
bda1f152 4305 else
de545baf 4306 {
4307 /* If a conversion function, e.g., __convert_i8_i4, was inserted
4308 into an array constructor, we should check if it can be reduced
4309 as an initialization expression. */
4310 if (rvalue->expr_type == EXPR_FUNCTION
4311 && rvalue->value.function.isym
4312 && (rvalue->value.function.isym->conversion == 1))
4313 gfc_check_init_expr (rvalue);
4314
4315 r = gfc_check_assign (&lvalue, rvalue, 1);
4316 }
4ee9c684 4317
434f0922 4318 free (lvalue.symtree);
9bb02a7e 4319 free (lvalue.ref);
4ee9c684 4320
60e19868 4321 if (!r)
23d075f4 4322 return r;
a90fe829 4323
688ff820 4324 if (pointer && rvalue->expr_type != EXPR_NULL && !proc_pointer)
23d075f4 4325 {
4326 /* F08:C461. Additional checks for pointer initialization. */
4327 symbol_attribute attr;
4328 attr = gfc_expr_attr (rvalue);
4329 if (attr.allocatable)
4330 {
16f7554b 4331 gfc_error ("Pointer initialization target at %L "
4332 "must not be ALLOCATABLE", &rvalue->where);
60e19868 4333 return false;
23d075f4 4334 }
e6c7d82b 4335 if (!attr.target || attr.pointer)
23d075f4 4336 {
16f7554b 4337 gfc_error ("Pointer initialization target at %L "
4338 "must have the TARGET attribute", &rvalue->where);
60e19868 4339 return false;
23d075f4 4340 }
16f7554b 4341
4342 if (!attr.save && rvalue->expr_type == EXPR_VARIABLE
4343 && rvalue->symtree->n.sym->ns->proc_name
4344 && rvalue->symtree->n.sym->ns->proc_name->attr.is_main_program)
4345 {
4346 rvalue->symtree->n.sym->ns->proc_name->attr.save = SAVE_IMPLICIT;
4347 attr.save = SAVE_IMPLICIT;
4348 }
4349
23d075f4 4350 if (!attr.save)
4351 {
16f7554b 4352 gfc_error ("Pointer initialization target at %L "
4353 "must have the SAVE attribute", &rvalue->where);
60e19868 4354 return false;
23d075f4 4355 }
4356 }
a90fe829 4357
16f7554b 4358 if (proc_pointer && rvalue->expr_type != EXPR_NULL)
e6c7d82b 4359 {
4360 /* F08:C1220. Additional checks for procedure pointer initialization. */
4361 symbol_attribute attr = gfc_expr_attr (rvalue);
4362 if (attr.proc_pointer)
4363 {
4364 gfc_error ("Procedure pointer initialization target at %L "
4365 "may not be a procedure pointer", &rvalue->where);
60e19868 4366 return false;
e6c7d82b 4367 }
4368 }
23d075f4 4369
60e19868 4370 return true;
4ee9c684 4371}
d9b3f26b 4372
c885c55e 4373/* Invoke gfc_build_init_expr to create an initializer expression, but do not
4374 * require that an expression be built. */
4375
4376gfc_expr *
4377gfc_build_default_init_expr (gfc_typespec *ts, locus *where)
4378{
4379 return gfc_build_init_expr (ts, where, false);
4380}
d9b3f26b 4381
36d310d0 4382/* Build an initializer for a local integer, real, complex, logical, or
4383 character variable, based on the command line flags finit-local-zero,
c885c55e 4384 finit-integer=, finit-real=, finit-logical=, and finit-character=.
4385 With force, an initializer is ALWAYS generated. */
36d310d0 4386
4387gfc_expr *
c885c55e 4388gfc_build_init_expr (gfc_typespec *ts, locus *where, bool force)
36d310d0 4389{
36d310d0 4390 gfc_expr *init_expr;
36d310d0 4391
4392 /* Try to build an initializer expression. */
4393 init_expr = gfc_get_constant_expr (ts->type, ts->kind, where);
4394
c885c55e 4395 /* If we want to force generation, make sure we default to zero. */
4396 gfc_init_local_real init_real = flag_init_real;
4397 int init_logical = gfc_option.flag_init_logical;
4398 if (force)
4399 {
4400 if (init_real == GFC_INIT_REAL_OFF)
4401 init_real = GFC_INIT_REAL_ZERO;
4402 if (init_logical == GFC_INIT_LOGICAL_OFF)
4403 init_logical = GFC_INIT_LOGICAL_FALSE;
4404 }
4405
36d310d0 4406 /* We will only initialize integers, reals, complex, logicals, and
4407 characters, and only if the corresponding command-line flags
4408 were set. Otherwise, we free init_expr and return null. */
4409 switch (ts->type)
4410 {
4411 case BT_INTEGER:
c885c55e 4412 if (force || gfc_option.flag_init_integer != GFC_INIT_INTEGER_OFF)
36d310d0 4413 mpz_set_si (init_expr->value.integer,
4414 gfc_option.flag_init_integer_value);
4415 else
4416 {
4417 gfc_free_expr (init_expr);
4418 init_expr = NULL;
4419 }
4420 break;
4421
4422 case BT_REAL:
c885c55e 4423 switch (init_real)
36d310d0 4424 {
4425 case GFC_INIT_REAL_SNAN:
4426 init_expr->is_snan = 1;
4427 /* Fall through. */
4428 case GFC_INIT_REAL_NAN:
4429 mpfr_set_nan (init_expr->value.real);
4430 break;
4431
4432 case GFC_INIT_REAL_INF:
4433 mpfr_set_inf (init_expr->value.real, 1);
4434 break;
4435
4436 case GFC_INIT_REAL_NEG_INF:
4437 mpfr_set_inf (init_expr->value.real, -1);
4438 break;
4439
4440 case GFC_INIT_REAL_ZERO:
4441 mpfr_set_ui (init_expr->value.real, 0.0, GFC_RND_MODE);
4442 break;
4443
4444 default:
4445 gfc_free_expr (init_expr);
4446 init_expr = NULL;
4447 break;
4448 }
4449 break;
4450
4451 case BT_COMPLEX:
c885c55e 4452 switch (init_real)
36d310d0 4453 {
4454 case GFC_INIT_REAL_SNAN:
4455 init_expr->is_snan = 1;
4456 /* Fall through. */
4457 case GFC_INIT_REAL_NAN:
4458 mpfr_set_nan (mpc_realref (init_expr->value.complex));
4459 mpfr_set_nan (mpc_imagref (init_expr->value.complex));
4460 break;
4461
4462 case GFC_INIT_REAL_INF:
4463 mpfr_set_inf (mpc_realref (init_expr->value.complex), 1);
4464 mpfr_set_inf (mpc_imagref (init_expr->value.complex), 1);
4465 break;
4466
4467 case GFC_INIT_REAL_NEG_INF:
4468 mpfr_set_inf (mpc_realref (init_expr->value.complex), -1);
4469 mpfr_set_inf (mpc_imagref (init_expr->value.complex), -1);
4470 break;
4471
4472 case GFC_INIT_REAL_ZERO:
4473 mpc_set_ui (init_expr->value.complex, 0, GFC_MPC_RND_MODE);
4474 break;
4475
4476 default:
4477 gfc_free_expr (init_expr);
4478 init_expr = NULL;
4479 break;
4480 }
4481 break;
4482
4483 case BT_LOGICAL:
c885c55e 4484 if (init_logical == GFC_INIT_LOGICAL_FALSE)
36d310d0 4485 init_expr->value.logical = 0;
c885c55e 4486 else if (init_logical == GFC_INIT_LOGICAL_TRUE)
36d310d0 4487 init_expr->value.logical = 1;
4488 else
4489 {
4490 gfc_free_expr (init_expr);
4491 init_expr = NULL;
4492 }
4493 break;
4494
4495 case BT_CHARACTER:
4496 /* For characters, the length must be constant in order to
4497 create a default initializer. */
c885c55e 4498 if ((force || gfc_option.flag_init_character == GFC_INIT_CHARACTER_ON)
36d310d0 4499 && ts->u.cl->length
4500 && ts->u.cl->length->expr_type == EXPR_CONSTANT)
4501 {
bdfec5bf 4502 HOST_WIDE_INT char_len = gfc_mpz_get_hwi (ts->u.cl->length->value.integer);
36d310d0 4503 init_expr->value.character.length = char_len;
4504 init_expr->value.character.string = gfc_get_wide_string (char_len+1);
bdfec5bf 4505 for (size_t i = 0; i < (size_t) char_len; i++)
36d310d0 4506 init_expr->value.character.string[i]
4507 = (unsigned char) gfc_option.flag_init_character_value;
4508 }
4509 else
4510 {
4511 gfc_free_expr (init_expr);
4512 init_expr = NULL;
4513 }
c885c55e 4514 if (!init_expr
4515 && (force || gfc_option.flag_init_character == GFC_INIT_CHARACTER_ON)
36d310d0 4516 && ts->u.cl->length && flag_max_stack_var_size != 0)
4517 {
4518 gfc_actual_arglist *arg;
4519 init_expr = gfc_get_expr ();
4520 init_expr->where = *where;
4521 init_expr->ts = *ts;
4522 init_expr->expr_type = EXPR_FUNCTION;
4523 init_expr->value.function.isym =
4524 gfc_intrinsic_function_by_id (GFC_ISYM_REPEAT);
4525 init_expr->value.function.name = "repeat";
4526 arg = gfc_get_actual_arglist ();
4527 arg->expr = gfc_get_character_expr (ts->kind, where, NULL, 1);
4528 arg->expr->value.character.string[0] =
4529 gfc_option.flag_init_character_value;
4530 arg->next = gfc_get_actual_arglist ();
4531 arg->next->expr = gfc_copy_expr (ts->u.cl->length);
4532 init_expr->value.function.actual = arg;
4533 }
4534 break;
4535
4536 default:
4537 gfc_free_expr (init_expr);
4538 init_expr = NULL;
4539 }
4540
4541 return init_expr;
4542}
4543
4544/* Apply an initialization expression to a typespec. Can be used for symbols or
4545 components. Similar to add_init_expr_to_sym in decl.c; could probably be
4546 combined with some effort. */
4547
4548void
4549gfc_apply_init (gfc_typespec *ts, symbol_attribute *attr, gfc_expr *init)
4550{
4551 if (ts->type == BT_CHARACTER && !attr->pointer && init
4552 && ts->u.cl
0ae3ceea 4553 && ts->u.cl->length
4554 && ts->u.cl->length->expr_type == EXPR_CONSTANT
4555 && ts->u.cl->length->ts.type == BT_INTEGER)
36d310d0 4556 {
bdfec5bf 4557 HOST_WIDE_INT len = gfc_mpz_get_hwi (ts->u.cl->length->value.integer);
36d310d0 4558
4559 if (init->expr_type == EXPR_CONSTANT)
4560 gfc_set_constant_character_len (len, init, -1);
4561 else if (init
2f9cad2b 4562 && init->ts.type == BT_CHARACTER
9afb622e 4563 && init->ts.u.cl && init->ts.u.cl->length
36d310d0 4564 && mpz_cmp (ts->u.cl->length->value.integer,
4565 init->ts.u.cl->length->value.integer))
4566 {
4567 gfc_constructor *ctor;
4568 ctor = gfc_constructor_first (init->value.constructor);
4569
4570 if (ctor)
4571 {
36d310d0 4572 bool has_ts = (init->ts.u.cl
4573 && init->ts.u.cl->length_from_typespec);
4574
4575 /* Remember the length of the first element for checking
4576 that all elements *in the constructor* have the same
4577 length. This need not be the length of the LHS! */
4578 gcc_assert (ctor->expr->expr_type == EXPR_CONSTANT);
4579 gcc_assert (ctor->expr->ts.type == BT_CHARACTER);
bdfec5bf 4580 gfc_charlen_t first_len = ctor->expr->value.character.length;
36d310d0 4581
4582 for ( ; ctor; ctor = gfc_constructor_next (ctor))
4583 if (ctor->expr->expr_type == EXPR_CONSTANT)
4584 {
4585 gfc_set_constant_character_len (len, ctor->expr,
4586 has_ts ? -1 : first_len);
df8ade88 4587 if (!ctor->expr->ts.u.cl)
4588 ctor->expr->ts.u.cl
4589 = gfc_new_charlen (gfc_current_ns, ts->u.cl);
4590 else
4591 ctor->expr->ts.u.cl->length
4592 = gfc_copy_expr (ts->u.cl->length);
36d310d0 4593 }
4594 }
4595 }
4596 }
4597}
4598
4599
5055cc98 4600/* Check whether an expression is a structure constructor and whether it has
4601 other values than NULL. */
4602
4603bool
4604is_non_empty_structure_constructor (gfc_expr * e)
4605{
4606 if (e->expr_type != EXPR_STRUCTURE)
4607 return false;
4608
4609 gfc_constructor *cons = gfc_constructor_first (e->value.constructor);
4610 while (cons)
4611 {
4612 if (!cons->expr || cons->expr->expr_type != EXPR_NULL)
4613 return true;
4614 cons = gfc_constructor_next (cons);
4615 }
4616 return false;
4617}
4618
4619
08262510 4620/* Check for default initializer; sym->value is not enough
4621 as it is also set for EXPR_NULL of allocatables. */
4622
4623bool
4624gfc_has_default_initializer (gfc_symbol *der)
4625{
4626 gfc_component *c;
4627
d7cd448a 4628 gcc_assert (gfc_fl_struct (der->attr.flavor));
08262510 4629 for (c = der->components; c; c = c->next)
d7cd448a 4630 if (gfc_bt_struct (c->ts.type))
08262510 4631 {
3d2337cf 4632 if (!c->attr.pointer && !c->attr.proc_pointer
dd7553fe 4633 && !(c->attr.allocatable && der == c->ts.u.derived)
5055cc98 4634 && ((c->initializer
4635 && is_non_empty_structure_constructor (c->initializer))
4636 || gfc_has_default_initializer (c->ts.u.derived)))
08262510 4637 return true;
a969de84 4638 if (c->attr.pointer && c->initializer)
4639 return true;
08262510 4640 }
4641 else
4642 {
4643 if (c->initializer)
4644 return true;
4645 }
4646
4647 return false;
4648}
4649
a969de84 4650
535a0ca2 4651/*
4652 Generate an initializer expression which initializes the entirety of a union.
4653 A normal structure constructor is insufficient without undue effort, because
4654 components of maps may be oddly aligned/overlapped. (For example if a
4655 character is initialized from one map overtop a real from the other, only one
4656 byte of the real is actually initialized.) Unfortunately we don't know the
4657 size of the union right now, so we can't generate a proper initializer, but
4658 we use a NULL expr as a placeholder and do the right thing later in
4659 gfc_trans_subcomponent_assign.
4660 */
4661static gfc_expr *
4662generate_union_initializer (gfc_component *un)
4663{
4664 if (un == NULL || un->ts.type != BT_UNION)
4665 return NULL;
4666
4667 gfc_expr *placeholder = gfc_get_null_expr (&un->loc);
4668 placeholder->ts = un->ts;
4669 return placeholder;
4670}
4671
4672
4673/* Get the user-specified initializer for a union, if any. This means the user
4674 has said to initialize component(s) of a map. For simplicity's sake we
4675 only allow the user to initialize the first map. We don't have to worry
4676 about overlapping initializers as they are released early in resolution (see
4677 resolve_fl_struct). */
4678
4679static gfc_expr *
4680get_union_initializer (gfc_symbol *union_type, gfc_component **map_p)
4681{
4682 gfc_component *map;
4683 gfc_expr *init=NULL;
4684
4685 if (!union_type || union_type->attr.flavor != FL_UNION)
4686 return NULL;
4687
4688 for (map = union_type->components; map; map = map->next)
4689 {
4690 if (gfc_has_default_initializer (map->ts.u.derived))
4691 {
4692 init = gfc_default_initializer (&map->ts);
4693 if (map_p)
4694 *map_p = map;
4695 break;
4696 }
4697 }
4698
4699 if (map_p && !init)
4700 *map_p = NULL;
4701
4702 return init;
4703}
4704
87c9579c 4705static bool
4706class_allocatable (gfc_component *comp)
4707{
4708 return comp->ts.type == BT_CLASS && CLASS_DATA (comp)
4709 && CLASS_DATA (comp)->attr.allocatable;
4710}
4711
4712static bool
4713class_pointer (gfc_component *comp)
4714{
4715 return comp->ts.type == BT_CLASS && CLASS_DATA (comp)
4716 && CLASS_DATA (comp)->attr.pointer;
4717}
4718
4719static bool
4720comp_allocatable (gfc_component *comp)
4721{
4722 return comp->attr.allocatable || class_allocatable (comp);
4723}
4724
4725static bool
4726comp_pointer (gfc_component *comp)
4727{
4728 return comp->attr.pointer
4729 || comp->attr.pointer
4730 || comp->attr.proc_pointer
4731 || comp->attr.class_pointer
4732 || class_pointer (comp);
4733}
4734
36d310d0 4735/* Fetch or generate an initializer for the given component.
4736 Only generate an initializer if generate is true. */
4737
4738static gfc_expr *
87c9579c 4739component_initializer (gfc_component *c, bool generate)
36d310d0 4740{
4741 gfc_expr *init = NULL;
4742
87c9579c 4743 /* Allocatable components always get EXPR_NULL.
4744 Pointer components are only initialized when generating, and only if they
4745 do not already have an initializer. */
4746 if (comp_allocatable (c) || (generate && comp_pointer (c) && !c->initializer))
4747 {
4748 init = gfc_get_null_expr (&c->loc);
4749 init->ts = c->ts;
4750 return init;
4751 }
4752
4753 /* See if we can find the initializer immediately. */
4754 if (c->initializer || !generate)
36d310d0 4755 return c->initializer;
4756
4757 /* Recursively handle derived type components. */
87c9579c 4758 else if (c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
36d310d0 4759 init = gfc_generate_initializer (&c->ts, true);
4760
535a0ca2 4761 else if (c->ts.type == BT_UNION && c->ts.u.derived->components)
4762 {
4763 gfc_component *map = NULL;
4764 gfc_constructor *ctor;
4765 gfc_expr *user_init;
4766
4767 /* If we don't have a user initializer and we aren't generating one, this
4768 union has no initializer. */
4769 user_init = get_union_initializer (c->ts.u.derived, &map);
4770 if (!user_init && !generate)
4771 return NULL;
4772
4773 /* Otherwise use a structure constructor. */
4774 init = gfc_get_structure_constructor_expr (c->ts.type, c->ts.kind,
4775 &c->loc);
4776 init->ts = c->ts;
4777
4778 /* If we are to generate an initializer for the union, add a constructor
4779 which initializes the whole union first. */
4780 if (generate)
4781 {
4782 ctor = gfc_constructor_get ();
4783 ctor->expr = generate_union_initializer (c);
4784 gfc_constructor_append (&init->value.constructor, ctor);
4785 }
4786
4787 /* If we found an initializer in one of our maps, apply it. Note this
4788 is applied _after_ the entire-union initializer above if any. */
4789 if (user_init)
4790 {
4791 ctor = gfc_constructor_get ();
4792 ctor->expr = user_init;
4793 ctor->n.component = map;
4794 gfc_constructor_append (&init->value.constructor, ctor);
4795 }
4796 }
4797
36d310d0 4798 /* Treat simple components like locals. */
4799 else
4800 {
c885c55e 4801 /* We MUST give an initializer, so force generation. */
4802 init = gfc_build_init_expr (&c->ts, &c->loc, true);
36d310d0 4803 gfc_apply_init (&c->ts, &c->attr, init);
4804 }
4805
87c9579c 4806 return init;
36d310d0 4807}
4808
4809
4810/* Get an expression for a default initializer of a derived type. */
d9b3f26b 4811
4812gfc_expr *
4813gfc_default_initializer (gfc_typespec *ts)
4814{
36d310d0 4815 return gfc_generate_initializer (ts, false);
4816}
4817
41d6b10e 4818/* Generate an initializer expression for an iso_c_binding type
4819 such as c_[fun]ptr. The appropriate initializer is c_null_[fun]ptr. */
4820
4821static gfc_expr *
4822generate_isocbinding_initializer (gfc_symbol *derived)
4823{
4824 /* The initializers have already been built into the c_null_[fun]ptr symbols
4825 from gen_special_c_interop_ptr. */
4826 gfc_symtree *npsym = NULL;
4827 if (0 == strcmp (derived->name, "c_ptr"))
4828 gfc_find_sym_tree ("c_null_ptr", gfc_current_ns, true, &npsym);
4829 else if (0 == strcmp (derived->name, "c_funptr"))
4830 gfc_find_sym_tree ("c_null_funptr", gfc_current_ns, true, &npsym);
4831 else
4832 gfc_internal_error ("generate_isocbinding_initializer(): bad iso_c_binding"
4833 " type, expected %<c_ptr%> or %<c_funptr%>");
4834 if (npsym)
4835 {
4836 gfc_expr *init = gfc_copy_expr (npsym->n.sym->value);
4837 init->symtree = npsym;
4838 init->ts.is_iso_c = true;
4839 return init;
4840 }
4841
4842 return NULL;
4843}
36d310d0 4844
dd7553fe 4845/* Get or generate an expression for a default initializer of a derived type.
36d310d0 4846 If -finit-derived is specified, generate default initialization expressions
4847 for components that lack them when generate is set. */
4848
4849gfc_expr *
4850gfc_generate_initializer (gfc_typespec *ts, bool generate)
4851{
4852 gfc_expr *init, *tmp;
126387b5 4853 gfc_component *comp;
41d6b10e 4854
36d310d0 4855 generate = flag_init_derived && generate;
d9b3f26b 4856
41d6b10e 4857 if (ts->u.derived->ts.is_iso_c && generate)
4858 return generate_isocbinding_initializer (ts->u.derived);
4859
08262510 4860 /* See if we have a default initializer in this, but not in nested
36d310d0 4861 types (otherwise we could use gfc_has_default_initializer()).
4862 We don't need to check if we are going to generate them. */
4863 comp = ts->u.derived->components;
4864 if (!generate)
4865 {
4866 for (; comp; comp = comp->next)
87c9579c 4867 if (comp->initializer || comp_allocatable (comp))
36d310d0 4868 break;
4869 }
d9b3f26b 4870
126387b5 4871 if (!comp)
d9b3f26b 4872 return NULL;
4873
126387b5 4874 init = gfc_get_structure_constructor_expr (ts->type, ts->kind,
4875 &ts->u.derived->declared_at);
d9b3f26b 4876 init->ts = *ts;
b809df7a 4877
126387b5 4878 for (comp = ts->u.derived->components; comp; comp = comp->next)
d9b3f26b 4879 {
126387b5 4880 gfc_constructor *ctor = gfc_constructor_get();
d9b3f26b 4881
36d310d0 4882 /* Fetch or generate an initializer for the component. */
87c9579c 4883 tmp = component_initializer (comp, generate);
36d310d0 4884 if (tmp)
4a4652dc 4885 {
88f949ab 4886 /* Save the component ref for STRUCTUREs and UNIONs. */
4887 if (ts->u.derived->attr.flavor == FL_STRUCT
4888 || ts->u.derived->attr.flavor == FL_UNION)
4889 ctor->n.component = comp;
36d310d0 4890
4891 /* If the initializer was not generated, we need a copy. */
4892 ctor->expr = comp->initializer ? gfc_copy_expr (tmp) : tmp;
87c9579c 4893 if ((comp->ts.type != tmp->ts.type || comp->ts.kind != tmp->ts.kind)
4a4652dc 4894 && !comp->attr.pointer && !comp->attr.proc_pointer)
6c7e7d1c 4895 {
4896 bool val;
4897 val = gfc_convert_type_warn (ctor->expr, &comp->ts, 1, false);
4898 if (val == false)
4899 return NULL;
4900 }
4a4652dc 4901 }
2294b616 4902
126387b5 4903 gfc_constructor_append (&init->value.constructor, ctor);
d9b3f26b 4904 }
126387b5 4905
d9b3f26b 4906 return init;
4907}
b4f45d02 4908
4909
4910/* Given a symbol, create an expression node with that symbol as a
4911 variable. If the symbol is array valued, setup a reference of the
4912 whole array. */
4913
4914gfc_expr *
1a9745d2 4915gfc_get_variable_expr (gfc_symtree *var)
b4f45d02 4916{
4917 gfc_expr *e;
4918
4919 e = gfc_get_expr ();
4920 e->expr_type = EXPR_VARIABLE;
4921 e->symtree = var;
4922 e->ts = var->n.sym->ts;
4923
70782c79 4924 if (var->n.sym->attr.flavor != FL_PROCEDURE
4925 && ((var->n.sym->as != NULL && var->n.sym->ts.type != BT_CLASS)
4926 || (var->n.sym->ts.type == BT_CLASS && CLASS_DATA (var->n.sym)
4927 && CLASS_DATA (var->n.sym)->as)))
b4f45d02 4928 {
3a19c063 4929 e->rank = var->n.sym->ts.type == BT_CLASS
4930 ? CLASS_DATA (var->n.sym)->as->rank : var->n.sym->as->rank;
b4f45d02 4931 e->ref = gfc_get_ref ();
4932 e->ref->type = REF_ARRAY;
4933 e->ref->u.ar.type = AR_FULL;
49dcd9d0 4934 e->ref->u.ar.as = gfc_copy_array_spec (var->n.sym->ts.type == BT_CLASS
4935 ? CLASS_DATA (var->n.sym)->as
4936 : var->n.sym->as);
b4f45d02 4937 }
4938
4939 return e;
4940}
4941
2c35ee8c 4942
d6463863 4943/* Adds a full array reference to an expression, as needed. */
4944
4945void
4946gfc_add_full_array_ref (gfc_expr *e, gfc_array_spec *as)
4947{
4948 gfc_ref *ref;
4949 for (ref = e->ref; ref; ref = ref->next)
4950 if (!ref->next)
4951 break;
4952 if (ref)
4953 {
4954 ref->next = gfc_get_ref ();
4955 ref = ref->next;
4956 }
4957 else
4958 {
4959 e->ref = gfc_get_ref ();
4960 ref = e->ref;
4961 }
4962 ref->type = REF_ARRAY;
4963 ref->u.ar.type = AR_FULL;
4964 ref->u.ar.dimen = e->rank;
4965 ref->u.ar.where = e->where;
4966 ref->u.ar.as = as;
4967}
4968
4969
e47d6ba5 4970gfc_expr *
4971gfc_lval_expr_from_sym (gfc_symbol *sym)
4972{
4973 gfc_expr *lval;
c6793847 4974 gfc_array_spec *as;
e47d6ba5 4975 lval = gfc_get_expr ();
4976 lval->expr_type = EXPR_VARIABLE;
4977 lval->where = sym->declared_at;
4978 lval->ts = sym->ts;
4979 lval->symtree = gfc_find_symtree (sym->ns->sym_root, sym->name);
4980
4981 /* It will always be a full array. */
c6793847 4982 as = IS_CLASS_ARRAY (sym) ? CLASS_DATA (sym)->as : sym->as;
4983 lval->rank = as ? as->rank : 0;
e47d6ba5 4984 if (lval->rank)
c6793847 4985 gfc_add_full_array_ref (lval, as);
e47d6ba5 4986 return lval;
4987}
4988
4989
ffc91ac1 4990/* Returns the array_spec of a full array expression. A NULL is
4991 returned otherwise. */
4992gfc_array_spec *
4993gfc_get_full_arrayspec_from_expr (gfc_expr *expr)
4994{
4995 gfc_array_spec *as;
4996 gfc_ref *ref;
4997
4998 if (expr->rank == 0)
4999 return NULL;
5000
5001 /* Follow any component references. */
5002 if (expr->expr_type == EXPR_VARIABLE
5003 || expr->expr_type == EXPR_CONSTANT)
5004 {
d9387d44 5005 if (expr->symtree)
5006 as = expr->symtree->n.sym->as;
5007 else
5008 as = NULL;
5009
ffc91ac1 5010 for (ref = expr->ref; ref; ref = ref->next)
5011 {
5012 switch (ref->type)
5013 {
5014 case REF_COMPONENT:
5015 as = ref->u.c.component->as;
5016 continue;
5017
5018 case REF_SUBSTRING:
23421d88 5019 case REF_INQUIRY:
ffc91ac1 5020 continue;
5021
5022 case REF_ARRAY:
5023 {
5024 switch (ref->u.ar.type)
5025 {
5026 case AR_ELEMENT:
5027 case AR_SECTION:
5028 case AR_UNKNOWN:
5029 as = NULL;
5030 continue;
5031
5032 case AR_FULL:
5033 break;
5034 }
5035 break;
5036 }
5037 }
5038 }
5039 }
5040 else
5041 as = NULL;
5042
5043 return as;
5044}
5045
5046
791d4123 5047/* General expression traversal function. */
2c35ee8c 5048
791d4123 5049bool
5050gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
5051 bool (*func)(gfc_expr *, gfc_symbol *, int*),
5052 int f)
2c35ee8c 5053{
791d4123 5054 gfc_array_ref ar;
2c35ee8c 5055 gfc_ref *ref;
791d4123 5056 gfc_actual_arglist *args;
5057 gfc_constructor *c;
2c35ee8c 5058 int i;
5059
791d4123 5060 if (!expr)
5061 return false;
2c35ee8c 5062
1acb400a 5063 if ((*func) (expr, sym, &f))
5064 return true;
2c35ee8c 5065
1acb400a 5066 if (expr->ts.type == BT_CHARACTER
eeebe20b 5067 && expr->ts.u.cl
5068 && expr->ts.u.cl->length
5069 && expr->ts.u.cl->length->expr_type != EXPR_CONSTANT
5070 && gfc_traverse_expr (expr->ts.u.cl->length, sym, func, f))
1acb400a 5071 return true;
2c35ee8c 5072
1acb400a 5073 switch (expr->expr_type)
5074 {
21d5f487 5075 case EXPR_PPC:
5076 case EXPR_COMPCALL:
791d4123 5077 case EXPR_FUNCTION:
5078 for (args = expr->value.function.actual; args; args = args->next)
5079 {
5080 if (gfc_traverse_expr (args->expr, sym, func, f))
5081 return true;
5082 }
2c35ee8c 5083 break;
5084
1acb400a 5085 case EXPR_VARIABLE:
2c35ee8c 5086 case EXPR_CONSTANT:
5087 case EXPR_NULL:
5088 case EXPR_SUBSTRING:
5089 break;
5090
5091 case EXPR_STRUCTURE:
5092 case EXPR_ARRAY:
126387b5 5093 for (c = gfc_constructor_first (expr->value.constructor);
5094 c; c = gfc_constructor_next (c))
1acb400a 5095 {
5096 if (gfc_traverse_expr (c->expr, sym, func, f))
5097 return true;
5098 if (c->iterator)
5099 {
5100 if (gfc_traverse_expr (c->iterator->var, sym, func, f))
5101 return true;
5102 if (gfc_traverse_expr (c->iterator->start, sym, func, f))
5103 return true;
5104 if (gfc_traverse_expr (c->iterator->end, sym, func, f))
5105 return true;
5106 if (gfc_traverse_expr (c->iterator->step, sym, func, f))
5107 return true;
5108 }
5109 }
2c35ee8c 5110 break;
5111
791d4123 5112 case EXPR_OP:
5113 if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
5114 return true;
5115 if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
5116 return true;
5117 break;
5118
2c35ee8c 5119 default:
5120 gcc_unreachable ();
5121 break;
5122 }
5123
791d4123 5124 ref = expr->ref;
5125 while (ref != NULL)
5126 {
2c35ee8c 5127 switch (ref->type)
1a9745d2 5128 {
791d4123 5129 case REF_ARRAY:
5130 ar = ref->u.ar;
5131 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
1a9745d2 5132 {
791d4123 5133 if (gfc_traverse_expr (ar.start[i], sym, func, f))
5134 return true;
5135 if (gfc_traverse_expr (ar.end[i], sym, func, f))
5136 return true;
5137 if (gfc_traverse_expr (ar.stride[i], sym, func, f))
5138 return true;
1a9745d2 5139 }
5140 break;
791d4123 5141
1a9745d2 5142 case REF_SUBSTRING:
791d4123 5143 if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
5144 return true;
5145 if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
5146 return true;
1a9745d2 5147 break;
791d4123 5148
1acb400a 5149 case REF_COMPONENT:
5150 if (ref->u.c.component->ts.type == BT_CHARACTER
eeebe20b 5151 && ref->u.c.component->ts.u.cl
5152 && ref->u.c.component->ts.u.cl->length
5153 && ref->u.c.component->ts.u.cl->length->expr_type
1acb400a 5154 != EXPR_CONSTANT
eeebe20b 5155 && gfc_traverse_expr (ref->u.c.component->ts.u.cl->length,
1acb400a 5156 sym, func, f))
5157 return true;
5158
5159 if (ref->u.c.component->as)
e97ac7c0 5160 for (i = 0; i < ref->u.c.component->as->rank
5161 + ref->u.c.component->as->corank; i++)
1acb400a 5162 {
5163 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
5164 sym, func, f))
5165 return true;
5166 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
5167 sym, func, f))
5168 return true;
5169 }
5170 break;
791d4123 5171
23421d88 5172 case REF_INQUIRY:
5173 return true;
5174
1a9745d2 5175 default:
5176 gcc_unreachable ();
1a9745d2 5177 }
791d4123 5178 ref = ref->next;
5179 }
5180 return false;
5181}
5182
5183/* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
5184
5185static bool
5186expr_set_symbols_referenced (gfc_expr *expr,
5187 gfc_symbol *sym ATTRIBUTE_UNUSED,
5188 int *f ATTRIBUTE_UNUSED)
5189{
1acb400a 5190 if (expr->expr_type != EXPR_VARIABLE)
5191 return false;
791d4123 5192 gfc_set_sym_referenced (expr->symtree->n.sym);
5193 return false;
5194}
5195
5196void
5197gfc_expr_set_symbols_referenced (gfc_expr *expr)
5198{
5199 gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
2c35ee8c 5200}
40de255b 5201
5202
b3961d7b 5203/* Determine if an expression is a procedure pointer component and return
5204 the component in that case. Otherwise return NULL. */
64e93293 5205
b3961d7b 5206gfc_component *
5207gfc_get_proc_ptr_comp (gfc_expr *expr)
64e93293 5208{
5209 gfc_ref *ref;
64e93293 5210
5211 if (!expr || !expr->ref)
b3961d7b 5212 return NULL;
64e93293 5213
5214 ref = expr->ref;
5215 while (ref->next)
5216 ref = ref->next;
5217
b3961d7b 5218 if (ref->type == REF_COMPONENT
5219 && ref->u.c.component->attr.proc_pointer)
5220 return ref->u.c.component;
5221
5222 return NULL;
5223}
5224
64e93293 5225
b3961d7b 5226/* Determine if an expression is a procedure pointer component. */
5227
5228bool
5229gfc_is_proc_ptr_comp (gfc_expr *expr)
5230{
5231 return (gfc_get_proc_ptr_comp (expr) != NULL);
64e93293 5232}
5233
5234
8ce60dbb 5235/* Determine if an expression is a function with an allocatable class scalar
5236 result. */
5237bool
5238gfc_is_alloc_class_scalar_function (gfc_expr *expr)
5239{
5240 if (expr->expr_type == EXPR_FUNCTION
5241 && expr->value.function.esym
5242 && expr->value.function.esym->result
5243 && expr->value.function.esym->result->ts.type == BT_CLASS
5244 && !CLASS_DATA (expr->value.function.esym->result)->attr.dimension
5245 && CLASS_DATA (expr->value.function.esym->result)->attr.allocatable)
5246 return true;
5247
5248 return false;
5249}
5250
5251
5252/* Determine if an expression is a function with an allocatable class array
5253 result. */
5254bool
9ead5324 5255gfc_is_class_array_function (gfc_expr *expr)
8ce60dbb 5256{
5257 if (expr->expr_type == EXPR_FUNCTION
5258 && expr->value.function.esym
5259 && expr->value.function.esym->result
5260 && expr->value.function.esym->result->ts.type == BT_CLASS
5261 && CLASS_DATA (expr->value.function.esym->result)->attr.dimension
9ead5324 5262 && (CLASS_DATA (expr->value.function.esym->result)->attr.allocatable
5263 || CLASS_DATA (expr->value.function.esym->result)->attr.pointer))
8ce60dbb 5264 return true;
5265
5266 return false;
5267}
5268
5269
40de255b 5270/* Walk an expression tree and check each variable encountered for being typed.
5271 If strict is not set, a top-level variable is tolerated untyped in -std=gnu
02761692 5272 mode as is a basic arithmetic expression using those; this is for things in
5273 legacy-code like:
40de255b 5274
5275 INTEGER :: arr(n), n
02761692 5276 INTEGER :: arr(n + 1), n
40de255b 5277
5278 The namespace is needed for IMPLICIT typing. */
5279
d1645c7b 5280static gfc_namespace* check_typed_ns;
5281
5282static bool
5283expr_check_typed_help (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
5284 int* f ATTRIBUTE_UNUSED)
40de255b 5285{
60e19868 5286 bool t;
40de255b 5287
d1645c7b 5288 if (e->expr_type != EXPR_VARIABLE)
5289 return false;
40de255b 5290
d1645c7b 5291 gcc_assert (e->symtree);
5292 t = gfc_check_symbol_typed (e->symtree->n.sym, check_typed_ns,
5293 true, e->where);
40de255b 5294
60e19868 5295 return (!t);
d1645c7b 5296}
40de255b 5297
60e19868 5298bool
d1645c7b 5299gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
5300{
5301 bool error_found;
40de255b 5302
02761692 5303 /* If this is a top-level variable or EXPR_OP, do the check with strict given
5304 to us. */
5305 if (!strict)
5306 {
5307 if (e->expr_type == EXPR_VARIABLE && !e->ref)
5308 return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
5309
5310 if (e->expr_type == EXPR_OP)
5311 {
60e19868 5312 bool t = true;
02761692 5313
5314 gcc_assert (e->value.op.op1);
5315 t = gfc_expr_check_typed (e->value.op.op1, ns, strict);
5316
60e19868 5317 if (t && e->value.op.op2)
02761692 5318 t = gfc_expr_check_typed (e->value.op.op2, ns, strict);
5319
5320 return t;
5321 }
5322 }
40de255b 5323
d1645c7b 5324 /* Otherwise, walk the expression and do it strictly. */
5325 check_typed_ns = ns;
5326 error_found = gfc_traverse_expr (e, NULL, &expr_check_typed_help, 0);
40de255b 5327
60e19868 5328 return error_found ? false : true;
40de255b 5329}
ecb6b17c 5330
d6ee884b 5331
9d958d5b 5332/* This function returns true if it contains any references to PDT KIND
5333 or LEN parameters. */
5334
5335static bool
5336derived_parameter_expr (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
5337 int* f ATTRIBUTE_UNUSED)
5338{
5339 if (e->expr_type != EXPR_VARIABLE)
5340 return false;
5341
5342 gcc_assert (e->symtree);
5343 if (e->symtree->n.sym->attr.pdt_kind
5344 || e->symtree->n.sym->attr.pdt_len)
5345 return true;
5346
5347 return false;
5348}
5349
5350
5351bool
5352gfc_derived_parameter_expr (gfc_expr *e)
5353{
5354 return gfc_traverse_expr (e, NULL, &derived_parameter_expr, 0);
5355}
5356
5357
5358/* This function returns the overall type of a type parameter spec list.
5359 If all the specs are explicit, SPEC_EXPLICIT is returned. If any of the
5360 parameters are assumed/deferred then SPEC_ASSUMED/DEFERRED is returned
5361 unless derived is not NULL. In this latter case, all the LEN parameters
5362 must be either assumed or deferred for the return argument to be set to
5363 anything other than SPEC_EXPLICIT. */
5364
5365gfc_param_spec_type
5366gfc_spec_list_type (gfc_actual_arglist *param_list, gfc_symbol *derived)
5367{
5368 gfc_param_spec_type res = SPEC_EXPLICIT;
5369 gfc_component *c;
5370 bool seen_assumed = false;
5371 bool seen_deferred = false;
5372
5373 if (derived == NULL)
5374 {
5375 for (; param_list; param_list = param_list->next)
5376 if (param_list->spec_type == SPEC_ASSUMED
5377 || param_list->spec_type == SPEC_DEFERRED)
5378 return param_list->spec_type;
5379 }
5380 else
5381 {
5382 for (; param_list; param_list = param_list->next)
5383 {
5384 c = gfc_find_component (derived, param_list->name,
5385 true, true, NULL);
5386 gcc_assert (c != NULL);
5387 if (c->attr.pdt_kind)
5388 continue;
5389 else if (param_list->spec_type == SPEC_EXPLICIT)
5390 return SPEC_EXPLICIT;
5391 seen_assumed = param_list->spec_type == SPEC_ASSUMED;
5392 seen_deferred = param_list->spec_type == SPEC_DEFERRED;
5393 if (seen_assumed && seen_deferred)
5394 return SPEC_EXPLICIT;
5395 }
5396 res = seen_assumed ? SPEC_ASSUMED : SPEC_DEFERRED;
5397 }
5398 return res;
5399}
5400
5401
0d3bb1de 5402bool
5403gfc_ref_this_image (gfc_ref *ref)
5404{
5405 int n;
5406
5407 gcc_assert (ref->type == REF_ARRAY && ref->u.ar.codimen > 0);
5408
5409 for (n = ref->u.ar.dimen; n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
5410 if (ref->u.ar.dimen_type[n] != DIMEN_THIS_IMAGE)
5411 return false;
5412
5413 return true;
5414}
5415
6b5471d8 5416gfc_expr *
6d3cbc0c 5417gfc_find_team_co (gfc_expr *e)
5418{
5419 gfc_ref *ref;
5420
5421 for (ref = e->ref; ref; ref = ref->next)
5422 if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
5423 return ref->u.ar.team;
5424
5425 if (e->value.function.actual->expr)
5426 for (ref = e->value.function.actual->expr->ref; ref;
5427 ref = ref->next)
5428 if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
5429 return ref->u.ar.team;
5430
5431 return NULL;
5432}
5433
5434gfc_expr *
5435gfc_find_stat_co (gfc_expr *e)
6b5471d8 5436{
5437 gfc_ref *ref;
5438
5439 for (ref = e->ref; ref; ref = ref->next)
5440 if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
5441 return ref->u.ar.stat;
5442
65cbb21d 5443 if (e->value.function.actual->expr)
5444 for (ref = e->value.function.actual->expr->ref; ref;
5445 ref = ref->next)
6b5471d8 5446 if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
5447 return ref->u.ar.stat;
5448
5449 return NULL;
5450}
0d3bb1de 5451
e97ac7c0 5452bool
5453gfc_is_coindexed (gfc_expr *e)
5454{
5455 gfc_ref *ref;
5456
5457 for (ref = e->ref; ref; ref = ref->next)
5458 if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
0d3bb1de 5459 return !gfc_ref_this_image (ref);
e97ac7c0 5460
5461 return false;
5462}
5463
5464
47c68cd4 5465/* Coarrays are variables with a corank but not being coindexed. However, also
5466 the following is a coarray: A subobject of a coarray is a coarray if it does
5467 not have any cosubscripts, vector subscripts, allocatable component
5468 selection, or pointer component selection. (F2008, 2.4.7) */
5469
5470bool
5471gfc_is_coarray (gfc_expr *e)
5472{
5473 gfc_ref *ref;
5474 gfc_symbol *sym;
5475 gfc_component *comp;
5476 bool coindexed;
5477 bool coarray;
5478 int i;
5479
5480 if (e->expr_type != EXPR_VARIABLE)
5481 return false;
5482
5483 coindexed = false;
5484 sym = e->symtree->n.sym;
5485
5486 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
5487 coarray = CLASS_DATA (sym)->attr.codimension;
5488 else
5489 coarray = sym->attr.codimension;
5490
5491 for (ref = e->ref; ref; ref = ref->next)
5492 switch (ref->type)
5493 {
5494 case REF_COMPONENT:
5495 comp = ref->u.c.component;
d0d776fb 5496 if (comp->ts.type == BT_CLASS && comp->attr.class_ok
5497 && (CLASS_DATA (comp)->attr.class_pointer
5498 || CLASS_DATA (comp)->attr.allocatable))
47c68cd4 5499 {
5500 coindexed = false;
d0d776fb 5501 coarray = CLASS_DATA (comp)->attr.codimension;
5502 }
5503 else if (comp->attr.pointer || comp->attr.allocatable)
5504 {
5505 coindexed = false;
5506 coarray = comp->attr.codimension;
47c68cd4 5507 }
5508 break;
5509
5510 case REF_ARRAY:
5511 if (!coarray)
5512 break;
5513
5514 if (ref->u.ar.codimen > 0 && !gfc_ref_this_image (ref))
5515 {
5516 coindexed = true;
5517 break;
5518 }
5519
5520 for (i = 0; i < ref->u.ar.dimen; i++)
5521 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
5522 {
5523 coarray = false;
5524 break;
5525 }
5526 break;
5527
5528 case REF_SUBSTRING:
23421d88 5529 case REF_INQUIRY:
47c68cd4 5530 break;
5531 }
5532
5533 return coarray && !coindexed;
5534}
5535
5536
43d0676f 5537int
1da1826b 5538gfc_get_corank (gfc_expr *e)
5539{
5540 int corank;
5541 gfc_ref *ref;
25f989b3 5542
5543 if (!gfc_is_coarray (e))
5544 return 0;
5545
fd23cc08 5546 if (e->ts.type == BT_CLASS && e->ts.u.derived->components)
5547 corank = e->ts.u.derived->components->as
5548 ? e->ts.u.derived->components->as->corank : 0;
a90fe829 5549 else
fd23cc08 5550 corank = e->symtree->n.sym->as ? e->symtree->n.sym->as->corank : 0;
25f989b3 5551
1da1826b 5552 for (ref = e->ref; ref; ref = ref->next)
5553 {
5554 if (ref->type == REF_ARRAY)
5555 corank = ref->u.ar.as->corank;
5556 gcc_assert (ref->type != REF_SUBSTRING);
5557 }
25f989b3 5558
1da1826b 5559 return corank;
5560}
5561
5562
e97ac7c0 5563/* Check whether the expression has an ultimate allocatable component.
5564 Being itself allocatable does not count. */
5565bool
5566gfc_has_ultimate_allocatable (gfc_expr *e)
5567{
5568 gfc_ref *ref, *last = NULL;
5569
5570 if (e->expr_type != EXPR_VARIABLE)
5571 return false;
5572
5573 for (ref = e->ref; ref; ref = ref->next)
5574 if (ref->type == REF_COMPONENT)
5575 last = ref;
5576
5577 if (last && last->u.c.component->ts.type == BT_CLASS)
50b4b37b 5578 return CLASS_DATA (last->u.c.component)->attr.alloc_comp;
e97ac7c0 5579 else if (last && last->u.c.component->ts.type == BT_DERIVED)
5580 return last->u.c.component->ts.u.derived->attr.alloc_comp;
5581 else if (last)
5582 return false;
5583
5584 if (e->ts.type == BT_CLASS)
50b4b37b 5585 return CLASS_DATA (e)->attr.alloc_comp;
e97ac7c0 5586 else if (e->ts.type == BT_DERIVED)
5587 return e->ts.u.derived->attr.alloc_comp;
5588 else
5589 return false;
5590}
5591
5592
5593/* Check whether the expression has an pointer component.
5594 Being itself a pointer does not count. */
5595bool
5596gfc_has_ultimate_pointer (gfc_expr *e)
5597{
5598 gfc_ref *ref, *last = NULL;
5599
5600 if (e->expr_type != EXPR_VARIABLE)
5601 return false;
5602
5603 for (ref = e->ref; ref; ref = ref->next)
5604 if (ref->type == REF_COMPONENT)
5605 last = ref;
a90fe829 5606
e97ac7c0 5607 if (last && last->u.c.component->ts.type == BT_CLASS)
50b4b37b 5608 return CLASS_DATA (last->u.c.component)->attr.pointer_comp;
e97ac7c0 5609 else if (last && last->u.c.component->ts.type == BT_DERIVED)
5610 return last->u.c.component->ts.u.derived->attr.pointer_comp;
5611 else if (last)
5612 return false;
5613
5614 if (e->ts.type == BT_CLASS)
50b4b37b 5615 return CLASS_DATA (e)->attr.pointer_comp;
e97ac7c0 5616 else if (e->ts.type == BT_DERIVED)
5617 return e->ts.u.derived->attr.pointer_comp;
5618 else
5619 return false;
5620}
b3c3927c 5621
5622
5623/* Check whether an expression is "simply contiguous", cf. F2008, 6.5.4.
5624 Note: A scalar is not regarded as "simply contiguous" by the standard.
df084314 5625 if bool is not strict, some further checks are done - for instance,
b3c3927c 5626 a "(::1)" is accepted. */
5627
5628bool
38bb9313 5629gfc_is_simply_contiguous (gfc_expr *expr, bool strict, bool permit_element)
b3c3927c 5630{
5631 bool colon;
5632 int i;
5633 gfc_array_ref *ar = NULL;
5634 gfc_ref *ref, *part_ref = NULL;
fd23cc08 5635 gfc_symbol *sym;
b3c3927c 5636
5637 if (expr->expr_type == EXPR_FUNCTION)
71037271 5638 {
5639 if (expr->value.function.esym)
5640 return expr->value.function.esym->result->attr.contiguous;
5641 else
5642 {
60aa99d0 5643 /* Type-bound procedures. */
5644 gfc_symbol *s = expr->symtree->n.sym;
5645 if (s->ts.type != BT_CLASS && s->ts.type != BT_DERIVED)
71037271 5646 return false;
082b5a23 5647
60aa99d0 5648 gfc_ref *rc = NULL;
5649 for (gfc_ref *r = expr->ref; r; r = r->next)
71037271 5650 if (r->type == REF_COMPONENT)
5651 rc = r;
5652
5653 if (rc == NULL || rc->u.c.component == NULL
5654 || rc->u.c.component->ts.interface == NULL)
5655 return false;
5656
5657 return rc->u.c.component->ts.interface->attr.contiguous;
5658 }
5659 }
b3c3927c 5660 else if (expr->expr_type != EXPR_VARIABLE)
5661 return false;
5662
38bb9313 5663 if (!permit_element && expr->rank == 0)
b3c3927c 5664 return false;
5665
5666 for (ref = expr->ref; ref; ref = ref->next)
5667 {
5668 if (ar)
293d72e0 5669 return false; /* Array shall be last part-ref. */
b3c3927c 5670
5671 if (ref->type == REF_COMPONENT)
5672 part_ref = ref;
5673 else if (ref->type == REF_SUBSTRING)
5674 return false;
5675 else if (ref->u.ar.type != AR_ELEMENT)
5676 ar = &ref->u.ar;
5677 }
5678
fd23cc08 5679 sym = expr->symtree->n.sym;
5680 if (expr->ts.type != BT_CLASS
47eab03d 5681 && ((part_ref
5682 && !part_ref->u.c.component->attr.contiguous
5683 && part_ref->u.c.component->attr.pointer)
5684 || (!part_ref
5685 && !sym->attr.contiguous
5686 && (sym->attr.pointer
5687 || (sym->as && sym->as->type == AS_ASSUMED_RANK)
5688 || (sym->as && sym->as->type == AS_ASSUMED_SHAPE)))))
b3c3927c 5689 return false;
5690
5691 if (!ar || ar->type == AR_FULL)
5692 return true;
5693
5694 gcc_assert (ar->type == AR_SECTION);
5695
5696 /* Check for simply contiguous array */
5697 colon = true;
5698 for (i = 0; i < ar->dimen; i++)
5699 {
5700 if (ar->dimen_type[i] == DIMEN_VECTOR)
5701 return false;
5702
5703 if (ar->dimen_type[i] == DIMEN_ELEMENT)
5704 {
5705 colon = false;
5706 continue;
5707 }
5708
5709 gcc_assert (ar->dimen_type[i] == DIMEN_RANGE);
5710
5711
5712 /* If the previous section was not contiguous, that's an error,
5713 unless we have effective only one element and checking is not
5714 strict. */
5715 if (!colon && (strict || !ar->start[i] || !ar->end[i]
5716 || ar->start[i]->expr_type != EXPR_CONSTANT
5717 || ar->end[i]->expr_type != EXPR_CONSTANT
5718 || mpz_cmp (ar->start[i]->value.integer,
5719 ar->end[i]->value.integer) != 0))
5720 return false;
5721
5722 /* Following the standard, "(::1)" or - if known at compile time -
df084314 5723 "(lbound:ubound)" are not simply contiguous; if strict
b3c3927c 5724 is false, they are regarded as simply contiguous. */
5725 if (ar->stride[i] && (strict || ar->stride[i]->expr_type != EXPR_CONSTANT
5726 || ar->stride[i]->ts.type != BT_INTEGER
5727 || mpz_cmp_si (ar->stride[i]->value.integer, 1) != 0))
5728 return false;
5729
5730 if (ar->start[i]
5731 && (strict || ar->start[i]->expr_type != EXPR_CONSTANT
5732 || !ar->as->lower[i]
5733 || ar->as->lower[i]->expr_type != EXPR_CONSTANT
5734 || mpz_cmp (ar->start[i]->value.integer,
5735 ar->as->lower[i]->value.integer) != 0))
5736 colon = false;
5737
5738 if (ar->end[i]
5739 && (strict || ar->end[i]->expr_type != EXPR_CONSTANT
5740 || !ar->as->upper[i]
5741 || ar->as->upper[i]->expr_type != EXPR_CONSTANT
5742 || mpz_cmp (ar->end[i]->value.integer,
5743 ar->as->upper[i]->value.integer) != 0))
5744 colon = false;
5745 }
a90fe829 5746
b3c3927c 5747 return true;
5748}
9fe43b2b 5749
5f34f219 5750/* Return true if the expression is guaranteed to be non-contiguous,
5751 false if we cannot prove anything. It is probably best to call
5752 this after gfc_is_simply_contiguous. If neither of them returns
5753 true, we cannot say (at compile-time). */
5754
5755bool
5756gfc_is_not_contiguous (gfc_expr *array)
5757{
5758 int i;
5759 gfc_array_ref *ar = NULL;
5760 gfc_ref *ref;
5761 bool previous_incomplete;
5762
5763 for (ref = array->ref; ref; ref = ref->next)
5764 {
5765 /* Array-ref shall be last ref. */
5766
5767 if (ar)
5768 return true;
5769
5770 if (ref->type == REF_ARRAY)
5771 ar = &ref->u.ar;
5772 }
5773
5774 if (ar == NULL || ar->type != AR_SECTION)
5775 return false;
5776
5777 previous_incomplete = false;
5778
5779 /* Check if we can prove that the array is not contiguous. */
5780
5781 for (i = 0; i < ar->dimen; i++)
5782 {
5783 mpz_t arr_size, ref_size;
5784
5785 if (gfc_ref_dimen_size (ar, i, &ref_size, NULL))
5786 {
5787 if (gfc_dep_difference (ar->as->lower[i], ar->as->upper[i], &arr_size))
5788 {
5789 /* a(2:4,2:) is known to be non-contiguous, but
5790 a(2:4,i:i) can be contiguous. */
5791 if (previous_incomplete && mpz_cmp_si (ref_size, 1) != 0)
5792 {
5793 mpz_clear (arr_size);
5794 mpz_clear (ref_size);
5795 return true;
5796 }
5797 else if (mpz_cmp (arr_size, ref_size) != 0)
5798 previous_incomplete = true;
5799
5800 mpz_clear (arr_size);
5801 }
5802
5803 /* Check for a(::2), i.e. where the stride is not unity.
5804 This is only done if there is more than one element in
5805 the reference along this dimension. */
5806
5807 if (mpz_cmp_ui (ref_size, 1) > 0 && ar->type == AR_SECTION
5808 && ar->dimen_type[i] == DIMEN_RANGE
5809 && ar->stride[i] && ar->stride[i]->expr_type == EXPR_CONSTANT
5810 && mpz_cmp_si (ar->stride[i]->value.integer, 1) != 0)
5811 return true;
5812
5813 mpz_clear (ref_size);
5814 }
5815 }
5816 /* We didn't find anything definitive. */
5817 return false;
5818}
9fe43b2b 5819
5820/* Build call to an intrinsic procedure. The number of arguments has to be
5821 passed (rather than ending the list with a NULL value) because we may
5822 want to add arguments but with a NULL-expression. */
5823
5824gfc_expr*
2dbe0f4c 5825gfc_build_intrinsic_call (gfc_namespace *ns, gfc_isym_id id, const char* name,
5826 locus where, unsigned numarg, ...)
9fe43b2b 5827{
5828 gfc_expr* result;
5829 gfc_actual_arglist* atail;
5830 gfc_intrinsic_sym* isym;
5831 va_list ap;
5832 unsigned i;
2dbe0f4c 5833 const char *mangled_name = gfc_get_string (GFC_PREFIX ("%s"), name);
9fe43b2b 5834
2dbe0f4c 5835 isym = gfc_intrinsic_function_by_id (id);
9fe43b2b 5836 gcc_assert (isym);
a90fe829 5837
9fe43b2b 5838 result = gfc_get_expr ();
5839 result->expr_type = EXPR_FUNCTION;
5840 result->ts = isym->ts;
5841 result->where = where;
2dbe0f4c 5842 result->value.function.name = mangled_name;
9fe43b2b 5843 result->value.function.isym = isym;
5844
2dbe0f4c 5845 gfc_get_sym_tree (mangled_name, ns, &result->symtree, false);
5846 gfc_commit_symbol (result->symtree->n.sym);
799347b4 5847 gcc_assert (result->symtree
5848 && (result->symtree->n.sym->attr.flavor == FL_PROCEDURE
5849 || result->symtree->n.sym->attr.flavor == FL_UNKNOWN));
2dbe0f4c 5850 result->symtree->n.sym->intmod_sym_id = id;
5851 result->symtree->n.sym->attr.flavor = FL_PROCEDURE;
5852 result->symtree->n.sym->attr.intrinsic = 1;
cefcf73f 5853 result->symtree->n.sym->attr.artificial = 1;
799347b4 5854
9fe43b2b 5855 va_start (ap, numarg);
5856 atail = NULL;
5857 for (i = 0; i < numarg; ++i)
5858 {
5859 if (atail)
5860 {
5861 atail->next = gfc_get_actual_arglist ();
5862 atail = atail->next;
5863 }
5864 else
5865 atail = result->value.function.actual = gfc_get_actual_arglist ();
5866
5867 atail->expr = va_arg (ap, gfc_expr*);
5868 }
5869 va_end (ap);
5870
5871 return result;
5872}
7725f40e 5873
5874
5875/* Check if an expression may appear in a variable definition context
5876 (F2008, 16.6.7) or pointer association context (F2008, 16.6.8).
5877 This is called from the various places when resolving
5878 the pieces that make up such a context.
091c5975 5879 If own_scope is true (applies to, e.g., ac-implied-do/data-implied-do
5880 variables), some checks are not performed.
7725f40e 5881
5882 Optionally, a possible error message can be suppressed if context is NULL
60e19868 5883 and just the return status (true / false) be requested. */
7725f40e 5884
60e19868 5885bool
c135f087 5886gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj,
091c5975 5887 bool own_scope, const char* context)
7725f40e 5888{
5ff3464c 5889 gfc_symbol* sym = NULL;
7725f40e 5890 bool is_pointer;
5891 bool check_intentin;
5892 bool ptr_component;
5893 symbol_attribute attr;
5894 gfc_ref* ref;
9986d8ae 5895 int i;
7725f40e 5896
5ff3464c 5897 if (e->expr_type == EXPR_VARIABLE)
5898 {
5899 gcc_assert (e->symtree);
5900 sym = e->symtree->n.sym;
5901 }
5902 else if (e->expr_type == EXPR_FUNCTION)
5903 {
5904 gcc_assert (e->symtree);
5905 sym = e->value.function.esym ? e->value.function.esym : e->symtree->n.sym;
5906 }
5907
d9fd8d25 5908 attr = gfc_expr_attr (e);
5909 if (!pointer && e->expr_type == EXPR_FUNCTION && attr.pointer)
62d8c84c 5910 {
5911 if (!(gfc_option.allow_std & GFC_STD_F2008))
5912 {
5913 if (context)
5914 gfc_error ("Fortran 2008: Pointer functions in variable definition"
5915 " context (%s) at %L", context, &e->where);
60e19868 5916 return false;
62d8c84c 5917 }
5918 }
5919 else if (e->expr_type != EXPR_VARIABLE)
7725f40e 5920 {
5921 if (context)
5922 gfc_error ("Non-variable expression in variable definition context (%s)"
5923 " at %L", context, &e->where);
60e19868 5924 return false;
7725f40e 5925 }
5926
7725f40e 5927 if (!pointer && sym->attr.flavor == FL_PARAMETER)
5928 {
5929 if (context)
716da296 5930 gfc_error ("Named constant %qs in variable definition context (%s)"
7725f40e 5931 " at %L", sym->name, context, &e->where);
60e19868 5932 return false;
7725f40e 5933 }
5934 if (!pointer && sym->attr.flavor != FL_VARIABLE
5935 && !(sym->attr.flavor == FL_PROCEDURE && sym == sym->result)
5936 && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer))
5937 {
5938 if (context)
716da296 5939 gfc_error ("%qs in variable definition context (%s) at %L is not"
7725f40e 5940 " a variable", sym->name, context, &e->where);
60e19868 5941 return false;
7725f40e 5942 }
5943
5944 /* Find out whether the expr is a pointer; this also means following
5945 component references to the last one. */
7725f40e 5946 is_pointer = (attr.pointer || attr.proc_pointer);
3597d081 5947 if (pointer && !is_pointer)
7725f40e 5948 {
5949 if (context)
5950 gfc_error ("Non-POINTER in pointer association context (%s)"
5951 " at %L", context, &e->where);
60e19868 5952 return false;
7725f40e 5953 }
5954
97323566 5955 if (e->ts.type == BT_DERIVED
5956 && e->ts.u.derived == NULL)
5957 {
5958 if (context)
5959 gfc_error ("Type inaccessible in variable definition context (%s) "
5960 "at %L", context, &e->where);
5961 return false;
5962 }
5963
c135f087 5964 /* F2008, C1303. */
5965 if (!alloc_obj
5966 && (attr.lock_comp
5967 || (e->ts.type == BT_DERIVED
5968 && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
5969 && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)))
5970 {
5971 if (context)
5972 gfc_error ("LOCK_TYPE in variable definition context (%s) at %L",
5973 context, &e->where);
60e19868 5974 return false;
c135f087 5975 }
5976
bd47f0bc 5977 /* TS18508, C702/C203. */
5978 if (!alloc_obj
5979 && (attr.lock_comp
5980 || (e->ts.type == BT_DERIVED
5981 && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
5982 && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)))
5983 {
5984 if (context)
5985 gfc_error ("LOCK_EVENT in variable definition context (%s) at %L",
5986 context, &e->where);
5987 return false;
5988 }
5989
308fdd1f 5990 /* INTENT(IN) dummy argument. Check this, unless the object itself is the
5991 component of sub-component of a pointer; we need to distinguish
5992 assignment to a pointer component from pointer-assignment to a pointer
5993 component. Note that (normal) assignment to procedure pointers is not
5994 possible. */
091c5975 5995 check_intentin = !own_scope;
10066eab 5996 ptr_component = (sym->ts.type == BT_CLASS && sym->ts.u.derived
5997 && CLASS_DATA (sym))
8957a593 5998 ? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer;
7725f40e 5999 for (ref = e->ref; ref && check_intentin; ref = ref->next)
6000 {
6001 if (ptr_component && ref->type == REF_COMPONENT)
6002 check_intentin = false;
6003 if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
308fdd1f 6004 {
6005 ptr_component = true;
6006 if (!pointer)
6007 check_intentin = false;
6008 }
7725f40e 6009 }
6010 if (check_intentin && sym->attr.intent == INTENT_IN)
6011 {
6012 if (pointer && is_pointer)
6013 {
6014 if (context)
716da296 6015 gfc_error ("Dummy argument %qs with INTENT(IN) in pointer"
7725f40e 6016 " association context (%s) at %L",
6017 sym->name, context, &e->where);
60e19868 6018 return false;
7725f40e 6019 }
62291378 6020 if (!pointer && !is_pointer && !sym->attr.pointer)
7725f40e 6021 {
6022 if (context)
716da296 6023 gfc_error ("Dummy argument %qs with INTENT(IN) in variable"
7725f40e 6024 " definition context (%s) at %L",
6025 sym->name, context, &e->where);
60e19868 6026 return false;
7725f40e 6027 }
6028 }
6029
6030 /* PROTECTED and use-associated. */
091c5975 6031 if (sym->attr.is_protected && sym->attr.use_assoc && check_intentin)
7725f40e 6032 {
6033 if (pointer && is_pointer)
6034 {
6035 if (context)
f4d3c071 6036 gfc_error ("Variable %qs is PROTECTED and cannot appear in a"
7725f40e 6037 " pointer association context (%s) at %L",
6038 sym->name, context, &e->where);
60e19868 6039 return false;
7725f40e 6040 }
6041 if (!pointer && !is_pointer)
6042 {
6043 if (context)
f4d3c071 6044 gfc_error ("Variable %qs is PROTECTED and cannot appear in a"
7725f40e 6045 " variable definition context (%s) at %L",
6046 sym->name, context, &e->where);
60e19868 6047 return false;
7725f40e 6048 }
6049 }
6050
6051 /* Variable not assignable from a PURE procedure but appears in
6052 variable definition context. */
091c5975 6053 if (!pointer && !own_scope && gfc_pure (NULL) && gfc_impure_variable (sym))
7725f40e 6054 {
6055 if (context)
f4d3c071 6056 gfc_error ("Variable %qs cannot appear in a variable definition"
7725f40e 6057 " context (%s) at %L in PURE procedure",
6058 sym->name, context, &e->where);
60e19868 6059 return false;
7725f40e 6060 }
6061
68218204 6062 if (!pointer && context && gfc_implicit_pure (NULL)
6063 && gfc_impure_variable (sym))
6064 {
6065 gfc_namespace *ns;
6066 gfc_symbol *sym;
8b0a2e85 6067
68218204 6068 for (ns = gfc_current_ns; ns; ns = ns->parent)
6069 {
6070 sym = ns->proc_name;
6071 if (sym == NULL)
6072 break;
6073 if (sym->attr.flavor == FL_PROCEDURE)
6074 {
6075 sym->attr.implicit_pure = 0;
6076 break;
6077 }
6078 }
6079 }
7725f40e 6080 /* Check variable definition context for associate-names. */
6081 if (!pointer && sym->assoc)
6082 {
6083 const char* name;
6084 gfc_association_list* assoc;
6085
6086 gcc_assert (sym->assoc->target);
6087
6088 /* If this is a SELECT TYPE temporary (the association is used internally
6089 for SELECT TYPE), silently go over to the target. */
6090 if (sym->attr.select_type_temporary)
6091 {
6092 gfc_expr* t = sym->assoc->target;
6093
6094 gcc_assert (t->expr_type == EXPR_VARIABLE);
6095 name = t->symtree->name;
6096
6097 if (t->symtree->n.sym->assoc)
6098 assoc = t->symtree->n.sym->assoc;
6099 else
6100 assoc = sym->assoc;
6101 }
6102 else
6103 {
6104 name = sym->name;
6105 assoc = sym->assoc;
6106 }
6107 gcc_assert (name && assoc);
6108
6109 /* Is association to a valid variable? */
6110 if (!assoc->variable)
6111 {
6112 if (context)
6113 {
6114 if (assoc->target->expr_type == EXPR_VARIABLE)
07c11f2b 6115 gfc_error ("%qs at %L associated to vector-indexed target"
6116 " cannot be used in a variable definition"
6117 " context (%s)",
7725f40e 6118 name, &e->where, context);
6119 else
07c11f2b 6120 gfc_error ("%qs at %L associated to expression"
6121 " cannot be used in a variable definition"
6122 " context (%s)",
7725f40e 6123 name, &e->where, context);
6124 }
60e19868 6125 return false;
7725f40e 6126 }
6127
6128 /* Target must be allowed to appear in a variable definition context. */
60e19868 6129 if (!gfc_check_vardef_context (assoc->target, pointer, false, false, NULL))
7725f40e 6130 {
6131 if (context)
f4d3c071 6132 gfc_error ("Associate-name %qs cannot appear in a variable"
7725f40e 6133 " definition context (%s) at %L because its target"
f4d3c071 6134 " at %L cannot, either",
7725f40e 6135 name, context, &e->where,
6136 &assoc->target->where);
60e19868 6137 return false;
7725f40e 6138 }
6139 }
6140
9986d8ae 6141 /* Check for same value in vector expression subscript. */
6142
6143 if (e->rank > 0)
6144 for (ref = e->ref; ref != NULL; ref = ref->next)
6145 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
6146 for (i = 0; i < GFC_MAX_DIMENSIONS
6147 && ref->u.ar.dimen_type[i] != 0; i++)
6148 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
6149 {
6150 gfc_expr *arr = ref->u.ar.start[i];
6151 if (arr->expr_type == EXPR_ARRAY)
6152 {
6153 gfc_constructor *c, *n;
6154 gfc_expr *ec, *en;
dd7553fe 6155
9986d8ae 6156 for (c = gfc_constructor_first (arr->value.constructor);
6157 c != NULL; c = gfc_constructor_next (c))
6158 {
6159 if (c == NULL || c->iterator != NULL)
6160 continue;
dd7553fe 6161
9986d8ae 6162 ec = c->expr;
6163
6164 for (n = gfc_constructor_next (c); n != NULL;
6165 n = gfc_constructor_next (n))
6166 {
6167 if (n->iterator != NULL)
6168 continue;
dd7553fe 6169
9986d8ae 6170 en = n->expr;
6171 if (gfc_dep_compare_expr (ec, en) == 0)
6172 {
00bc0309 6173 if (context)
e87256b0 6174 gfc_error_now ("Elements with the same value "
6175 "at %L and %L in vector "
6176 "subscript in a variable "
6177 "definition context (%s)",
6178 &(ec->where), &(en->where),
6179 context);
9986d8ae 6180 return false;
6181 }
6182 }
6183 }
6184 }
6185 }
dd7553fe 6186
60e19868 6187 return true;
7725f40e 6188}