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