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