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