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