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