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