2017-09-12 Paul Thomas <pault@gcc.gnu.org>
[official-gcc.git] / gcc / fortran / expr.c
blob87ea09f03d64a8cab9e02038d2c0c2f366e59f54
1 /* Routines for manipulation of expression nodes.
2 Copyright (C) 2000-2017 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
5 This file is part of GCC.
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.
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.
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/>. */
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"
32 /* The following set of functions provide access to gfc_expr* of
33 various types - actual all but EXPR_FUNCTION and EXPR_VARIABLE.
35 There are two functions available elsewhere that provide
36 slightly different flavours of variables. Namely:
37 expr.c (gfc_get_variable_expr)
38 symbol.c (gfc_lval_expr_from_sym)
39 TODO: Merge these functions, if possible. */
41 /* Get a new expression node. */
43 gfc_expr *
44 gfc_get_expr (void)
46 gfc_expr *e;
48 e = XCNEW (gfc_expr);
49 gfc_clear_ts (&e->ts);
50 e->shape = NULL;
51 e->ref = NULL;
52 e->symtree = NULL;
53 return e;
57 /* Get a new expression node that is an array constructor
58 of given type and kind. */
60 gfc_expr *
61 gfc_get_array_expr (bt type, int kind, locus *where)
63 gfc_expr *e;
65 e = gfc_get_expr ();
66 e->expr_type = EXPR_ARRAY;
67 e->value.constructor = NULL;
68 e->rank = 1;
69 e->shape = NULL;
71 e->ts.type = type;
72 e->ts.kind = kind;
73 if (where)
74 e->where = *where;
76 return e;
80 /* Get a new expression node that is the NULL expression. */
82 gfc_expr *
83 gfc_get_null_expr (locus *where)
85 gfc_expr *e;
87 e = gfc_get_expr ();
88 e->expr_type = EXPR_NULL;
89 e->ts.type = BT_UNKNOWN;
91 if (where)
92 e->where = *where;
94 return e;
98 /* Get a new expression node that is an operator expression node. */
100 gfc_expr *
101 gfc_get_operator_expr (locus *where, gfc_intrinsic_op op,
102 gfc_expr *op1, gfc_expr *op2)
104 gfc_expr *e;
106 e = gfc_get_expr ();
107 e->expr_type = EXPR_OP;
108 e->value.op.op = op;
109 e->value.op.op1 = op1;
110 e->value.op.op2 = op2;
112 if (where)
113 e->where = *where;
115 return e;
119 /* Get a new expression node that is an structure constructor
120 of given type and kind. */
122 gfc_expr *
123 gfc_get_structure_constructor_expr (bt type, int kind, locus *where)
125 gfc_expr *e;
127 e = gfc_get_expr ();
128 e->expr_type = EXPR_STRUCTURE;
129 e->value.constructor = NULL;
131 e->ts.type = type;
132 e->ts.kind = kind;
133 if (where)
134 e->where = *where;
136 return e;
140 /* Get a new expression node that is an constant of given type and kind. */
142 gfc_expr *
143 gfc_get_constant_expr (bt type, int kind, locus *where)
145 gfc_expr *e;
147 if (!where)
148 gfc_internal_error ("gfc_get_constant_expr(): locus %<where%> cannot be "
149 "NULL");
151 e = gfc_get_expr ();
153 e->expr_type = EXPR_CONSTANT;
154 e->ts.type = type;
155 e->ts.kind = kind;
156 e->where = *where;
158 switch (type)
160 case BT_INTEGER:
161 mpz_init (e->value.integer);
162 break;
164 case BT_REAL:
165 gfc_set_model_kind (kind);
166 mpfr_init (e->value.real);
167 break;
169 case BT_COMPLEX:
170 gfc_set_model_kind (kind);
171 mpc_init2 (e->value.complex, mpfr_get_default_prec());
172 break;
174 default:
175 break;
178 return e;
182 /* Get a new expression node that is an string constant.
183 If no string is passed, a string of len is allocated,
184 blanked and null-terminated. */
186 gfc_expr *
187 gfc_get_character_expr (int kind, locus *where, const char *src, int len)
189 gfc_expr *e;
190 gfc_char_t *dest;
192 if (!src)
194 dest = gfc_get_wide_string (len + 1);
195 gfc_wide_memset (dest, ' ', len);
196 dest[len] = '\0';
198 else
199 dest = gfc_char_to_widechar (src);
201 e = gfc_get_constant_expr (BT_CHARACTER, kind,
202 where ? where : &gfc_current_locus);
203 e->value.character.string = dest;
204 e->value.character.length = len;
206 return e;
210 /* Get a new expression node that is an integer constant. */
212 gfc_expr *
213 gfc_get_int_expr (int kind, locus *where, int value)
215 gfc_expr *p;
216 p = gfc_get_constant_expr (BT_INTEGER, kind,
217 where ? where : &gfc_current_locus);
219 mpz_set_si (p->value.integer, value);
221 return p;
225 /* Get a new expression node that is a logical constant. */
227 gfc_expr *
228 gfc_get_logical_expr (int kind, locus *where, bool value)
230 gfc_expr *p;
231 p = gfc_get_constant_expr (BT_LOGICAL, kind,
232 where ? where : &gfc_current_locus);
234 p->value.logical = value;
236 return p;
240 gfc_expr *
241 gfc_get_iokind_expr (locus *where, io_kind k)
243 gfc_expr *e;
245 /* Set the types to something compatible with iokind. This is needed to
246 get through gfc_free_expr later since iokind really has no Basic Type,
247 BT, of its own. */
249 e = gfc_get_expr ();
250 e->expr_type = EXPR_CONSTANT;
251 e->ts.type = BT_LOGICAL;
252 e->value.iokind = k;
253 e->where = *where;
255 return e;
259 /* Given an expression pointer, return a copy of the expression. This
260 subroutine is recursive. */
262 gfc_expr *
263 gfc_copy_expr (gfc_expr *p)
265 gfc_expr *q;
266 gfc_char_t *s;
267 char *c;
269 if (p == NULL)
270 return NULL;
272 q = gfc_get_expr ();
273 *q = *p;
275 switch (q->expr_type)
277 case EXPR_SUBSTRING:
278 s = gfc_get_wide_string (p->value.character.length + 1);
279 q->value.character.string = s;
280 memcpy (s, p->value.character.string,
281 (p->value.character.length + 1) * sizeof (gfc_char_t));
282 break;
284 case EXPR_CONSTANT:
285 /* Copy target representation, if it exists. */
286 if (p->representation.string)
288 c = XCNEWVEC (char, p->representation.length + 1);
289 q->representation.string = c;
290 memcpy (c, p->representation.string, (p->representation.length + 1));
293 /* Copy the values of any pointer components of p->value. */
294 switch (q->ts.type)
296 case BT_INTEGER:
297 mpz_init_set (q->value.integer, p->value.integer);
298 break;
300 case BT_REAL:
301 gfc_set_model_kind (q->ts.kind);
302 mpfr_init (q->value.real);
303 mpfr_set (q->value.real, p->value.real, GFC_RND_MODE);
304 break;
306 case BT_COMPLEX:
307 gfc_set_model_kind (q->ts.kind);
308 mpc_init2 (q->value.complex, mpfr_get_default_prec());
309 mpc_set (q->value.complex, p->value.complex, GFC_MPC_RND_MODE);
310 break;
312 case BT_CHARACTER:
313 if (p->representation.string)
314 q->value.character.string
315 = gfc_char_to_widechar (q->representation.string);
316 else
318 s = gfc_get_wide_string (p->value.character.length + 1);
319 q->value.character.string = s;
321 /* This is the case for the C_NULL_CHAR named constant. */
322 if (p->value.character.length == 0
323 && (p->ts.is_c_interop || p->ts.is_iso_c))
325 *s = '\0';
326 /* Need to set the length to 1 to make sure the NUL
327 terminator is copied. */
328 q->value.character.length = 1;
330 else
331 memcpy (s, p->value.character.string,
332 (p->value.character.length + 1) * sizeof (gfc_char_t));
334 break;
336 case BT_HOLLERITH:
337 case BT_LOGICAL:
338 case_bt_struct:
339 case BT_CLASS:
340 case BT_ASSUMED:
341 break; /* Already done. */
343 case BT_PROCEDURE:
344 case BT_VOID:
345 /* Should never be reached. */
346 case BT_UNKNOWN:
347 gfc_internal_error ("gfc_copy_expr(): Bad expr node");
348 /* Not reached. */
351 break;
353 case EXPR_OP:
354 switch (q->value.op.op)
356 case INTRINSIC_NOT:
357 case INTRINSIC_PARENTHESES:
358 case INTRINSIC_UPLUS:
359 case INTRINSIC_UMINUS:
360 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
361 break;
363 default: /* Binary operators. */
364 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
365 q->value.op.op2 = gfc_copy_expr (p->value.op.op2);
366 break;
369 break;
371 case EXPR_FUNCTION:
372 q->value.function.actual =
373 gfc_copy_actual_arglist (p->value.function.actual);
374 break;
376 case EXPR_COMPCALL:
377 case EXPR_PPC:
378 q->value.compcall.actual =
379 gfc_copy_actual_arglist (p->value.compcall.actual);
380 q->value.compcall.tbp = p->value.compcall.tbp;
381 break;
383 case EXPR_STRUCTURE:
384 case EXPR_ARRAY:
385 q->value.constructor = gfc_constructor_copy (p->value.constructor);
386 break;
388 case EXPR_VARIABLE:
389 case EXPR_NULL:
390 break;
393 q->shape = gfc_copy_shape (p->shape, p->rank);
395 q->ref = gfc_copy_ref (p->ref);
397 if (p->param_list)
398 q->param_list = gfc_copy_actual_arglist (p->param_list);
400 return q;
404 void
405 gfc_clear_shape (mpz_t *shape, int rank)
407 int i;
409 for (i = 0; i < rank; i++)
410 mpz_clear (shape[i]);
414 void
415 gfc_free_shape (mpz_t **shape, int rank)
417 if (*shape == NULL)
418 return;
420 gfc_clear_shape (*shape, rank);
421 free (*shape);
422 *shape = NULL;
426 /* Workhorse function for gfc_free_expr() that frees everything
427 beneath an expression node, but not the node itself. This is
428 useful when we want to simplify a node and replace it with
429 something else or the expression node belongs to another structure. */
431 static void
432 free_expr0 (gfc_expr *e)
434 switch (e->expr_type)
436 case EXPR_CONSTANT:
437 /* Free any parts of the value that need freeing. */
438 switch (e->ts.type)
440 case BT_INTEGER:
441 mpz_clear (e->value.integer);
442 break;
444 case BT_REAL:
445 mpfr_clear (e->value.real);
446 break;
448 case BT_CHARACTER:
449 free (e->value.character.string);
450 break;
452 case BT_COMPLEX:
453 mpc_clear (e->value.complex);
454 break;
456 default:
457 break;
460 /* Free the representation. */
461 free (e->representation.string);
463 break;
465 case EXPR_OP:
466 if (e->value.op.op1 != NULL)
467 gfc_free_expr (e->value.op.op1);
468 if (e->value.op.op2 != NULL)
469 gfc_free_expr (e->value.op.op2);
470 break;
472 case EXPR_FUNCTION:
473 gfc_free_actual_arglist (e->value.function.actual);
474 break;
476 case EXPR_COMPCALL:
477 case EXPR_PPC:
478 gfc_free_actual_arglist (e->value.compcall.actual);
479 break;
481 case EXPR_VARIABLE:
482 break;
484 case EXPR_ARRAY:
485 case EXPR_STRUCTURE:
486 gfc_constructor_free (e->value.constructor);
487 break;
489 case EXPR_SUBSTRING:
490 free (e->value.character.string);
491 break;
493 case EXPR_NULL:
494 break;
496 default:
497 gfc_internal_error ("free_expr0(): Bad expr type");
500 /* Free a shape array. */
501 gfc_free_shape (&e->shape, e->rank);
503 gfc_free_ref_list (e->ref);
505 gfc_free_actual_arglist (e->param_list);
507 memset (e, '\0', sizeof (gfc_expr));
511 /* Free an expression node and everything beneath it. */
513 void
514 gfc_free_expr (gfc_expr *e)
516 if (e == NULL)
517 return;
518 free_expr0 (e);
519 free (e);
523 /* Free an argument list and everything below it. */
525 void
526 gfc_free_actual_arglist (gfc_actual_arglist *a1)
528 gfc_actual_arglist *a2;
530 while (a1)
532 a2 = a1->next;
533 if (a1->expr)
534 gfc_free_expr (a1->expr);
535 free (a1);
536 a1 = a2;
541 /* Copy an arglist structure and all of the arguments. */
543 gfc_actual_arglist *
544 gfc_copy_actual_arglist (gfc_actual_arglist *p)
546 gfc_actual_arglist *head, *tail, *new_arg;
548 head = tail = NULL;
550 for (; p; p = p->next)
552 new_arg = gfc_get_actual_arglist ();
553 *new_arg = *p;
555 new_arg->expr = gfc_copy_expr (p->expr);
556 new_arg->next = NULL;
558 if (head == NULL)
559 head = new_arg;
560 else
561 tail->next = new_arg;
563 tail = new_arg;
566 return head;
570 /* Free a list of reference structures. */
572 void
573 gfc_free_ref_list (gfc_ref *p)
575 gfc_ref *q;
576 int i;
578 for (; p; p = q)
580 q = p->next;
582 switch (p->type)
584 case REF_ARRAY:
585 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
587 gfc_free_expr (p->u.ar.start[i]);
588 gfc_free_expr (p->u.ar.end[i]);
589 gfc_free_expr (p->u.ar.stride[i]);
592 break;
594 case REF_SUBSTRING:
595 gfc_free_expr (p->u.ss.start);
596 gfc_free_expr (p->u.ss.end);
597 break;
599 case REF_COMPONENT:
600 break;
603 free (p);
608 /* Graft the *src expression onto the *dest subexpression. */
610 void
611 gfc_replace_expr (gfc_expr *dest, gfc_expr *src)
613 free_expr0 (dest);
614 *dest = *src;
615 free (src);
619 /* Try to extract an integer constant from the passed expression node.
620 Return true if some error occurred, false on success. If REPORT_ERROR
621 is non-zero, emit error, for positive REPORT_ERROR using gfc_error,
622 for negative using gfc_error_now. */
624 bool
625 gfc_extract_int (gfc_expr *expr, int *result, int report_error)
627 gfc_ref *ref;
629 /* A KIND component is a parameter too. The expression for it
630 is stored in the initializer and should be consistent with
631 the tests below. */
632 if (gfc_expr_attr(expr).pdt_kind)
634 for (ref = expr->ref; ref; ref = ref->next)
636 if (ref->u.c.component->attr.pdt_kind)
637 expr = ref->u.c.component->initializer;
641 if (expr->expr_type != EXPR_CONSTANT)
643 if (report_error > 0)
644 gfc_error ("Constant expression required at %C");
645 else if (report_error < 0)
646 gfc_error_now ("Constant expression required at %C");
647 return true;
650 if (expr->ts.type != BT_INTEGER)
652 if (report_error > 0)
653 gfc_error ("Integer expression required at %C");
654 else if (report_error < 0)
655 gfc_error_now ("Integer expression required at %C");
656 return true;
659 if ((mpz_cmp_si (expr->value.integer, INT_MAX) > 0)
660 || (mpz_cmp_si (expr->value.integer, INT_MIN) < 0))
662 if (report_error > 0)
663 gfc_error ("Integer value too large in expression at %C");
664 else if (report_error < 0)
665 gfc_error_now ("Integer value too large in expression at %C");
666 return true;
669 *result = (int) mpz_get_si (expr->value.integer);
671 return false;
675 /* Recursively copy a list of reference structures. */
677 gfc_ref *
678 gfc_copy_ref (gfc_ref *src)
680 gfc_array_ref *ar;
681 gfc_ref *dest;
683 if (src == NULL)
684 return NULL;
686 dest = gfc_get_ref ();
687 dest->type = src->type;
689 switch (src->type)
691 case REF_ARRAY:
692 ar = gfc_copy_array_ref (&src->u.ar);
693 dest->u.ar = *ar;
694 free (ar);
695 break;
697 case REF_COMPONENT:
698 dest->u.c = src->u.c;
699 break;
701 case REF_SUBSTRING:
702 dest->u.ss = src->u.ss;
703 dest->u.ss.start = gfc_copy_expr (src->u.ss.start);
704 dest->u.ss.end = gfc_copy_expr (src->u.ss.end);
705 break;
708 dest->next = gfc_copy_ref (src->next);
710 return dest;
714 /* Detect whether an expression has any vector index array references. */
717 gfc_has_vector_index (gfc_expr *e)
719 gfc_ref *ref;
720 int i;
721 for (ref = e->ref; ref; ref = ref->next)
722 if (ref->type == REF_ARRAY)
723 for (i = 0; i < ref->u.ar.dimen; i++)
724 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
725 return 1;
726 return 0;
730 /* Copy a shape array. */
732 mpz_t *
733 gfc_copy_shape (mpz_t *shape, int rank)
735 mpz_t *new_shape;
736 int n;
738 if (shape == NULL)
739 return NULL;
741 new_shape = gfc_get_shape (rank);
743 for (n = 0; n < rank; n++)
744 mpz_init_set (new_shape[n], shape[n]);
746 return new_shape;
750 /* Copy a shape array excluding dimension N, where N is an integer
751 constant expression. Dimensions are numbered in Fortran style --
752 starting with ONE.
754 So, if the original shape array contains R elements
755 { s1 ... sN-1 sN sN+1 ... sR-1 sR}
756 the result contains R-1 elements:
757 { s1 ... sN-1 sN+1 ... sR-1}
759 If anything goes wrong -- N is not a constant, its value is out
760 of range -- or anything else, just returns NULL. */
762 mpz_t *
763 gfc_copy_shape_excluding (mpz_t *shape, int rank, gfc_expr *dim)
765 mpz_t *new_shape, *s;
766 int i, n;
768 if (shape == NULL
769 || rank <= 1
770 || dim == NULL
771 || dim->expr_type != EXPR_CONSTANT
772 || dim->ts.type != BT_INTEGER)
773 return NULL;
775 n = mpz_get_si (dim->value.integer);
776 n--; /* Convert to zero based index. */
777 if (n < 0 || n >= rank)
778 return NULL;
780 s = new_shape = gfc_get_shape (rank - 1);
782 for (i = 0; i < rank; i++)
784 if (i == n)
785 continue;
786 mpz_init_set (*s, shape[i]);
787 s++;
790 return new_shape;
794 /* Return the maximum kind of two expressions. In general, higher
795 kind numbers mean more precision for numeric types. */
798 gfc_kind_max (gfc_expr *e1, gfc_expr *e2)
800 return (e1->ts.kind > e2->ts.kind) ? e1->ts.kind : e2->ts.kind;
804 /* Returns nonzero if the type is numeric, zero otherwise. */
806 static int
807 numeric_type (bt type)
809 return type == BT_COMPLEX || type == BT_REAL || type == BT_INTEGER;
813 /* Returns nonzero if the typespec is a numeric type, zero otherwise. */
816 gfc_numeric_ts (gfc_typespec *ts)
818 return numeric_type (ts->type);
822 /* Return an expression node with an optional argument list attached.
823 A variable number of gfc_expr pointers are strung together in an
824 argument list with a NULL pointer terminating the list. */
826 gfc_expr *
827 gfc_build_conversion (gfc_expr *e)
829 gfc_expr *p;
831 p = gfc_get_expr ();
832 p->expr_type = EXPR_FUNCTION;
833 p->symtree = NULL;
834 p->value.function.actual = gfc_get_actual_arglist ();
835 p->value.function.actual->expr = e;
837 return p;
841 /* Given an expression node with some sort of numeric binary
842 expression, insert type conversions required to make the operands
843 have the same type. Conversion warnings are disabled if wconversion
844 is set to 0.
846 The exception is that the operands of an exponential don't have to
847 have the same type. If possible, the base is promoted to the type
848 of the exponent. For example, 1**2.3 becomes 1.0**2.3, but
849 1.0**2 stays as it is. */
851 void
852 gfc_type_convert_binary (gfc_expr *e, int wconversion)
854 gfc_expr *op1, *op2;
856 op1 = e->value.op.op1;
857 op2 = e->value.op.op2;
859 if (op1->ts.type == BT_UNKNOWN || op2->ts.type == BT_UNKNOWN)
861 gfc_clear_ts (&e->ts);
862 return;
865 /* Kind conversions of same type. */
866 if (op1->ts.type == op2->ts.type)
868 if (op1->ts.kind == op2->ts.kind)
870 /* No type conversions. */
871 e->ts = op1->ts;
872 goto done;
875 if (op1->ts.kind > op2->ts.kind)
876 gfc_convert_type_warn (op2, &op1->ts, 2, wconversion);
877 else
878 gfc_convert_type_warn (op1, &op2->ts, 2, wconversion);
880 e->ts = op1->ts;
881 goto done;
884 /* Integer combined with real or complex. */
885 if (op2->ts.type == BT_INTEGER)
887 e->ts = op1->ts;
889 /* Special case for ** operator. */
890 if (e->value.op.op == INTRINSIC_POWER)
891 goto done;
893 gfc_convert_type_warn (e->value.op.op2, &e->ts, 2, wconversion);
894 goto done;
897 if (op1->ts.type == BT_INTEGER)
899 e->ts = op2->ts;
900 gfc_convert_type_warn (e->value.op.op1, &e->ts, 2, wconversion);
901 goto done;
904 /* Real combined with complex. */
905 e->ts.type = BT_COMPLEX;
906 if (op1->ts.kind > op2->ts.kind)
907 e->ts.kind = op1->ts.kind;
908 else
909 e->ts.kind = op2->ts.kind;
910 if (op1->ts.type != BT_COMPLEX || op1->ts.kind != e->ts.kind)
911 gfc_convert_type_warn (e->value.op.op1, &e->ts, 2, wconversion);
912 if (op2->ts.type != BT_COMPLEX || op2->ts.kind != e->ts.kind)
913 gfc_convert_type_warn (e->value.op.op2, &e->ts, 2, wconversion);
915 done:
916 return;
920 /* Determine if an expression is constant in the sense of F08:7.1.12.
921 * This function expects that the expression has already been simplified. */
923 bool
924 gfc_is_constant_expr (gfc_expr *e)
926 gfc_constructor *c;
927 gfc_actual_arglist *arg;
929 if (e == NULL)
930 return true;
932 switch (e->expr_type)
934 case EXPR_OP:
935 return (gfc_is_constant_expr (e->value.op.op1)
936 && (e->value.op.op2 == NULL
937 || gfc_is_constant_expr (e->value.op.op2)));
939 case EXPR_VARIABLE:
940 /* The only context in which this can occur is in a parameterized
941 derived type declaration, so returning true is OK. */
942 if (e->symtree->n.sym->attr.pdt_len
943 || e->symtree->n.sym->attr.pdt_kind)
944 return true;
945 return false;
947 case EXPR_FUNCTION:
948 case EXPR_PPC:
949 case EXPR_COMPCALL:
950 gcc_assert (e->symtree || e->value.function.esym
951 || e->value.function.isym);
953 /* Call to intrinsic with at least one argument. */
954 if (e->value.function.isym && e->value.function.actual)
956 for (arg = e->value.function.actual; arg; arg = arg->next)
957 if (!gfc_is_constant_expr (arg->expr))
958 return false;
961 if (e->value.function.isym
962 && (e->value.function.isym->elemental
963 || e->value.function.isym->pure
964 || e->value.function.isym->inquiry
965 || e->value.function.isym->transformational))
966 return true;
968 return false;
970 case EXPR_CONSTANT:
971 case EXPR_NULL:
972 return true;
974 case EXPR_SUBSTRING:
975 return e->ref == NULL || (gfc_is_constant_expr (e->ref->u.ss.start)
976 && gfc_is_constant_expr (e->ref->u.ss.end));
978 case EXPR_ARRAY:
979 case EXPR_STRUCTURE:
980 c = gfc_constructor_first (e->value.constructor);
981 if ((e->expr_type == EXPR_ARRAY) && c && c->iterator)
982 return gfc_constant_ac (e);
984 for (; c; c = gfc_constructor_next (c))
985 if (!gfc_is_constant_expr (c->expr))
986 return false;
988 return true;
991 default:
992 gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
993 return false;
998 /* Is true if an array reference is followed by a component or substring
999 reference. */
1000 bool
1001 is_subref_array (gfc_expr * e)
1003 gfc_ref * ref;
1004 bool seen_array;
1006 if (e->expr_type != EXPR_VARIABLE)
1007 return false;
1009 if (e->symtree->n.sym->attr.subref_array_pointer)
1010 return true;
1012 if (e->symtree->n.sym->ts.type == BT_CLASS
1013 && e->symtree->n.sym->attr.dummy
1014 && CLASS_DATA (e->symtree->n.sym)->attr.class_pointer)
1015 return true;
1017 seen_array = false;
1018 for (ref = e->ref; ref; ref = ref->next)
1020 if (ref->type == REF_ARRAY
1021 && ref->u.ar.type != AR_ELEMENT)
1022 seen_array = true;
1024 if (seen_array
1025 && ref->type != REF_ARRAY)
1026 return seen_array;
1028 return false;
1032 /* Try to collapse intrinsic expressions. */
1034 static bool
1035 simplify_intrinsic_op (gfc_expr *p, int type)
1037 gfc_intrinsic_op op;
1038 gfc_expr *op1, *op2, *result;
1040 if (p->value.op.op == INTRINSIC_USER)
1041 return true;
1043 op1 = p->value.op.op1;
1044 op2 = p->value.op.op2;
1045 op = p->value.op.op;
1047 if (!gfc_simplify_expr (op1, type))
1048 return false;
1049 if (!gfc_simplify_expr (op2, type))
1050 return false;
1052 if (!gfc_is_constant_expr (op1)
1053 || (op2 != NULL && !gfc_is_constant_expr (op2)))
1054 return true;
1056 /* Rip p apart. */
1057 p->value.op.op1 = NULL;
1058 p->value.op.op2 = NULL;
1060 switch (op)
1062 case INTRINSIC_PARENTHESES:
1063 result = gfc_parentheses (op1);
1064 break;
1066 case INTRINSIC_UPLUS:
1067 result = gfc_uplus (op1);
1068 break;
1070 case INTRINSIC_UMINUS:
1071 result = gfc_uminus (op1);
1072 break;
1074 case INTRINSIC_PLUS:
1075 result = gfc_add (op1, op2);
1076 break;
1078 case INTRINSIC_MINUS:
1079 result = gfc_subtract (op1, op2);
1080 break;
1082 case INTRINSIC_TIMES:
1083 result = gfc_multiply (op1, op2);
1084 break;
1086 case INTRINSIC_DIVIDE:
1087 result = gfc_divide (op1, op2);
1088 break;
1090 case INTRINSIC_POWER:
1091 result = gfc_power (op1, op2);
1092 break;
1094 case INTRINSIC_CONCAT:
1095 result = gfc_concat (op1, op2);
1096 break;
1098 case INTRINSIC_EQ:
1099 case INTRINSIC_EQ_OS:
1100 result = gfc_eq (op1, op2, op);
1101 break;
1103 case INTRINSIC_NE:
1104 case INTRINSIC_NE_OS:
1105 result = gfc_ne (op1, op2, op);
1106 break;
1108 case INTRINSIC_GT:
1109 case INTRINSIC_GT_OS:
1110 result = gfc_gt (op1, op2, op);
1111 break;
1113 case INTRINSIC_GE:
1114 case INTRINSIC_GE_OS:
1115 result = gfc_ge (op1, op2, op);
1116 break;
1118 case INTRINSIC_LT:
1119 case INTRINSIC_LT_OS:
1120 result = gfc_lt (op1, op2, op);
1121 break;
1123 case INTRINSIC_LE:
1124 case INTRINSIC_LE_OS:
1125 result = gfc_le (op1, op2, op);
1126 break;
1128 case INTRINSIC_NOT:
1129 result = gfc_not (op1);
1130 break;
1132 case INTRINSIC_AND:
1133 result = gfc_and (op1, op2);
1134 break;
1136 case INTRINSIC_OR:
1137 result = gfc_or (op1, op2);
1138 break;
1140 case INTRINSIC_EQV:
1141 result = gfc_eqv (op1, op2);
1142 break;
1144 case INTRINSIC_NEQV:
1145 result = gfc_neqv (op1, op2);
1146 break;
1148 default:
1149 gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
1152 if (result == NULL)
1154 gfc_free_expr (op1);
1155 gfc_free_expr (op2);
1156 return false;
1159 result->rank = p->rank;
1160 result->where = p->where;
1161 gfc_replace_expr (p, result);
1163 return true;
1167 /* Subroutine to simplify constructor expressions. Mutually recursive
1168 with gfc_simplify_expr(). */
1170 static bool
1171 simplify_constructor (gfc_constructor_base base, int type)
1173 gfc_constructor *c;
1174 gfc_expr *p;
1176 for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
1178 if (c->iterator
1179 && (!gfc_simplify_expr(c->iterator->start, type)
1180 || !gfc_simplify_expr (c->iterator->end, type)
1181 || !gfc_simplify_expr (c->iterator->step, type)))
1182 return false;
1184 if (c->expr)
1186 /* Try and simplify a copy. Replace the original if successful
1187 but keep going through the constructor at all costs. Not
1188 doing so can make a dog's dinner of complicated things. */
1189 p = gfc_copy_expr (c->expr);
1191 if (!gfc_simplify_expr (p, type))
1193 gfc_free_expr (p);
1194 continue;
1197 gfc_replace_expr (c->expr, p);
1201 return true;
1205 /* Pull a single array element out of an array constructor. */
1207 static bool
1208 find_array_element (gfc_constructor_base base, gfc_array_ref *ar,
1209 gfc_constructor **rval)
1211 unsigned long nelemen;
1212 int i;
1213 mpz_t delta;
1214 mpz_t offset;
1215 mpz_t span;
1216 mpz_t tmp;
1217 gfc_constructor *cons;
1218 gfc_expr *e;
1219 bool t;
1221 t = true;
1222 e = NULL;
1224 mpz_init_set_ui (offset, 0);
1225 mpz_init (delta);
1226 mpz_init (tmp);
1227 mpz_init_set_ui (span, 1);
1228 for (i = 0; i < ar->dimen; i++)
1230 if (!gfc_reduce_init_expr (ar->as->lower[i])
1231 || !gfc_reduce_init_expr (ar->as->upper[i]))
1233 t = false;
1234 cons = NULL;
1235 goto depart;
1238 e = ar->start[i];
1239 if (e->expr_type != EXPR_CONSTANT)
1241 cons = NULL;
1242 goto depart;
1245 gcc_assert (ar->as->upper[i]->expr_type == EXPR_CONSTANT
1246 && ar->as->lower[i]->expr_type == EXPR_CONSTANT);
1248 /* Check the bounds. */
1249 if ((ar->as->upper[i]
1250 && mpz_cmp (e->value.integer,
1251 ar->as->upper[i]->value.integer) > 0)
1252 || (mpz_cmp (e->value.integer,
1253 ar->as->lower[i]->value.integer) < 0))
1255 gfc_error ("Index in dimension %d is out of bounds "
1256 "at %L", i + 1, &ar->c_where[i]);
1257 cons = NULL;
1258 t = false;
1259 goto depart;
1262 mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer);
1263 mpz_mul (delta, delta, span);
1264 mpz_add (offset, offset, delta);
1266 mpz_set_ui (tmp, 1);
1267 mpz_add (tmp, tmp, ar->as->upper[i]->value.integer);
1268 mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
1269 mpz_mul (span, span, tmp);
1272 for (cons = gfc_constructor_first (base), nelemen = mpz_get_ui (offset);
1273 cons && nelemen > 0; cons = gfc_constructor_next (cons), nelemen--)
1275 if (cons->iterator)
1277 cons = NULL;
1278 goto depart;
1282 depart:
1283 mpz_clear (delta);
1284 mpz_clear (offset);
1285 mpz_clear (span);
1286 mpz_clear (tmp);
1287 *rval = cons;
1288 return t;
1292 /* Find a component of a structure constructor. */
1294 static gfc_constructor *
1295 find_component_ref (gfc_constructor_base base, gfc_ref *ref)
1297 gfc_component *pick = ref->u.c.component;
1298 gfc_constructor *c = gfc_constructor_first (base);
1300 gfc_symbol *dt = ref->u.c.sym;
1301 int ext = dt->attr.extension;
1303 /* For extended types, check if the desired component is in one of the
1304 * parent types. */
1305 while (ext > 0 && gfc_find_component (dt->components->ts.u.derived,
1306 pick->name, true, true, NULL))
1308 dt = dt->components->ts.u.derived;
1309 c = gfc_constructor_first (c->expr->value.constructor);
1310 ext--;
1313 gfc_component *comp = dt->components;
1314 while (comp != pick)
1316 comp = comp->next;
1317 c = gfc_constructor_next (c);
1320 return c;
1324 /* Replace an expression with the contents of a constructor, removing
1325 the subobject reference in the process. */
1327 static void
1328 remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
1330 gfc_expr *e;
1332 if (cons)
1334 e = cons->expr;
1335 cons->expr = NULL;
1337 else
1338 e = gfc_copy_expr (p);
1339 e->ref = p->ref->next;
1340 p->ref->next = NULL;
1341 gfc_replace_expr (p, e);
1345 /* Pull an array section out of an array constructor. */
1347 static bool
1348 find_array_section (gfc_expr *expr, gfc_ref *ref)
1350 int idx;
1351 int rank;
1352 int d;
1353 int shape_i;
1354 int limit;
1355 long unsigned one = 1;
1356 bool incr_ctr;
1357 mpz_t start[GFC_MAX_DIMENSIONS];
1358 mpz_t end[GFC_MAX_DIMENSIONS];
1359 mpz_t stride[GFC_MAX_DIMENSIONS];
1360 mpz_t delta[GFC_MAX_DIMENSIONS];
1361 mpz_t ctr[GFC_MAX_DIMENSIONS];
1362 mpz_t delta_mpz;
1363 mpz_t tmp_mpz;
1364 mpz_t nelts;
1365 mpz_t ptr;
1366 gfc_constructor_base base;
1367 gfc_constructor *cons, *vecsub[GFC_MAX_DIMENSIONS];
1368 gfc_expr *begin;
1369 gfc_expr *finish;
1370 gfc_expr *step;
1371 gfc_expr *upper;
1372 gfc_expr *lower;
1373 bool t;
1375 t = true;
1377 base = expr->value.constructor;
1378 expr->value.constructor = NULL;
1380 rank = ref->u.ar.as->rank;
1382 if (expr->shape == NULL)
1383 expr->shape = gfc_get_shape (rank);
1385 mpz_init_set_ui (delta_mpz, one);
1386 mpz_init_set_ui (nelts, one);
1387 mpz_init (tmp_mpz);
1389 /* Do the initialization now, so that we can cleanup without
1390 keeping track of where we were. */
1391 for (d = 0; d < rank; d++)
1393 mpz_init (delta[d]);
1394 mpz_init (start[d]);
1395 mpz_init (end[d]);
1396 mpz_init (ctr[d]);
1397 mpz_init (stride[d]);
1398 vecsub[d] = NULL;
1401 /* Build the counters to clock through the array reference. */
1402 shape_i = 0;
1403 for (d = 0; d < rank; d++)
1405 /* Make this stretch of code easier on the eye! */
1406 begin = ref->u.ar.start[d];
1407 finish = ref->u.ar.end[d];
1408 step = ref->u.ar.stride[d];
1409 lower = ref->u.ar.as->lower[d];
1410 upper = ref->u.ar.as->upper[d];
1412 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
1414 gfc_constructor *ci;
1415 gcc_assert (begin);
1417 if (begin->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (begin))
1419 t = false;
1420 goto cleanup;
1423 gcc_assert (begin->rank == 1);
1424 /* Zero-sized arrays have no shape and no elements, stop early. */
1425 if (!begin->shape)
1427 mpz_init_set_ui (nelts, 0);
1428 break;
1431 vecsub[d] = gfc_constructor_first (begin->value.constructor);
1432 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1433 mpz_mul (nelts, nelts, begin->shape[0]);
1434 mpz_set (expr->shape[shape_i++], begin->shape[0]);
1436 /* Check bounds. */
1437 for (ci = vecsub[d]; ci; ci = gfc_constructor_next (ci))
1439 if (mpz_cmp (ci->expr->value.integer, upper->value.integer) > 0
1440 || mpz_cmp (ci->expr->value.integer,
1441 lower->value.integer) < 0)
1443 gfc_error ("index in dimension %d is out of bounds "
1444 "at %L", d + 1, &ref->u.ar.c_where[d]);
1445 t = false;
1446 goto cleanup;
1450 else
1452 if ((begin && begin->expr_type != EXPR_CONSTANT)
1453 || (finish && finish->expr_type != EXPR_CONSTANT)
1454 || (step && step->expr_type != EXPR_CONSTANT))
1456 t = false;
1457 goto cleanup;
1460 /* Obtain the stride. */
1461 if (step)
1462 mpz_set (stride[d], step->value.integer);
1463 else
1464 mpz_set_ui (stride[d], one);
1466 if (mpz_cmp_ui (stride[d], 0) == 0)
1467 mpz_set_ui (stride[d], one);
1469 /* Obtain the start value for the index. */
1470 if (begin)
1471 mpz_set (start[d], begin->value.integer);
1472 else
1473 mpz_set (start[d], lower->value.integer);
1475 mpz_set (ctr[d], start[d]);
1477 /* Obtain the end value for the index. */
1478 if (finish)
1479 mpz_set (end[d], finish->value.integer);
1480 else
1481 mpz_set (end[d], upper->value.integer);
1483 /* Separate 'if' because elements sometimes arrive with
1484 non-null end. */
1485 if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1486 mpz_set (end [d], begin->value.integer);
1488 /* Check the bounds. */
1489 if (mpz_cmp (ctr[d], upper->value.integer) > 0
1490 || mpz_cmp (end[d], upper->value.integer) > 0
1491 || mpz_cmp (ctr[d], lower->value.integer) < 0
1492 || mpz_cmp (end[d], lower->value.integer) < 0)
1494 gfc_error ("index in dimension %d is out of bounds "
1495 "at %L", d + 1, &ref->u.ar.c_where[d]);
1496 t = false;
1497 goto cleanup;
1500 /* Calculate the number of elements and the shape. */
1501 mpz_set (tmp_mpz, stride[d]);
1502 mpz_add (tmp_mpz, end[d], tmp_mpz);
1503 mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1504 mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1505 mpz_mul (nelts, nelts, tmp_mpz);
1507 /* An element reference reduces the rank of the expression; don't
1508 add anything to the shape array. */
1509 if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT)
1510 mpz_set (expr->shape[shape_i++], tmp_mpz);
1513 /* Calculate the 'stride' (=delta) for conversion of the
1514 counter values into the index along the constructor. */
1515 mpz_set (delta[d], delta_mpz);
1516 mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1517 mpz_add_ui (tmp_mpz, tmp_mpz, one);
1518 mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1521 mpz_init (ptr);
1522 cons = gfc_constructor_first (base);
1524 /* Now clock through the array reference, calculating the index in
1525 the source constructor and transferring the elements to the new
1526 constructor. */
1527 for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
1529 mpz_init_set_ui (ptr, 0);
1531 incr_ctr = true;
1532 for (d = 0; d < rank; d++)
1534 mpz_set (tmp_mpz, ctr[d]);
1535 mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
1536 mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1537 mpz_add (ptr, ptr, tmp_mpz);
1539 if (!incr_ctr) continue;
1541 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
1543 gcc_assert(vecsub[d]);
1545 if (!gfc_constructor_next (vecsub[d]))
1546 vecsub[d] = gfc_constructor_first (ref->u.ar.start[d]->value.constructor);
1547 else
1549 vecsub[d] = gfc_constructor_next (vecsub[d]);
1550 incr_ctr = false;
1552 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1554 else
1556 mpz_add (ctr[d], ctr[d], stride[d]);
1558 if (mpz_cmp_ui (stride[d], 0) > 0
1559 ? mpz_cmp (ctr[d], end[d]) > 0
1560 : mpz_cmp (ctr[d], end[d]) < 0)
1561 mpz_set (ctr[d], start[d]);
1562 else
1563 incr_ctr = false;
1567 limit = mpz_get_ui (ptr);
1568 if (limit >= flag_max_array_constructor)
1570 gfc_error ("The number of elements in the array constructor "
1571 "at %L requires an increase of the allowed %d "
1572 "upper limit. See -fmax-array-constructor "
1573 "option", &expr->where, flag_max_array_constructor);
1574 return false;
1577 cons = gfc_constructor_lookup (base, limit);
1578 gcc_assert (cons);
1579 gfc_constructor_append_expr (&expr->value.constructor,
1580 gfc_copy_expr (cons->expr), NULL);
1583 mpz_clear (ptr);
1585 cleanup:
1587 mpz_clear (delta_mpz);
1588 mpz_clear (tmp_mpz);
1589 mpz_clear (nelts);
1590 for (d = 0; d < rank; d++)
1592 mpz_clear (delta[d]);
1593 mpz_clear (start[d]);
1594 mpz_clear (end[d]);
1595 mpz_clear (ctr[d]);
1596 mpz_clear (stride[d]);
1598 gfc_constructor_free (base);
1599 return t;
1602 /* Pull a substring out of an expression. */
1604 static bool
1605 find_substring_ref (gfc_expr *p, gfc_expr **newp)
1607 int end;
1608 int start;
1609 int length;
1610 gfc_char_t *chr;
1612 if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1613 || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1614 return false;
1616 *newp = gfc_copy_expr (p);
1617 free ((*newp)->value.character.string);
1619 end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer);
1620 start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer);
1621 length = end - start + 1;
1623 chr = (*newp)->value.character.string = gfc_get_wide_string (length + 1);
1624 (*newp)->value.character.length = length;
1625 memcpy (chr, &p->value.character.string[start - 1],
1626 length * sizeof (gfc_char_t));
1627 chr[length] = '\0';
1628 return true;
1633 /* Simplify a subobject reference of a constructor. This occurs when
1634 parameter variable values are substituted. */
1636 static bool
1637 simplify_const_ref (gfc_expr *p)
1639 gfc_constructor *cons, *c;
1640 gfc_expr *newp;
1641 gfc_ref *last_ref;
1643 while (p->ref)
1645 switch (p->ref->type)
1647 case REF_ARRAY:
1648 switch (p->ref->u.ar.type)
1650 case AR_ELEMENT:
1651 /* <type/kind spec>, parameter :: x(<int>) = scalar_expr
1652 will generate this. */
1653 if (p->expr_type != EXPR_ARRAY)
1655 remove_subobject_ref (p, NULL);
1656 break;
1658 if (!find_array_element (p->value.constructor, &p->ref->u.ar, &cons))
1659 return false;
1661 if (!cons)
1662 return true;
1664 remove_subobject_ref (p, cons);
1665 break;
1667 case AR_SECTION:
1668 if (!find_array_section (p, p->ref))
1669 return false;
1670 p->ref->u.ar.type = AR_FULL;
1672 /* Fall through. */
1674 case AR_FULL:
1675 if (p->ref->next != NULL
1676 && (p->ts.type == BT_CHARACTER || gfc_bt_struct (p->ts.type)))
1678 for (c = gfc_constructor_first (p->value.constructor);
1679 c; c = gfc_constructor_next (c))
1681 c->expr->ref = gfc_copy_ref (p->ref->next);
1682 if (!simplify_const_ref (c->expr))
1683 return false;
1686 if (gfc_bt_struct (p->ts.type)
1687 && p->ref->next
1688 && (c = gfc_constructor_first (p->value.constructor)))
1690 /* There may have been component references. */
1691 p->ts = c->expr->ts;
1694 last_ref = p->ref;
1695 for (; last_ref->next; last_ref = last_ref->next) {};
1697 if (p->ts.type == BT_CHARACTER
1698 && last_ref->type == REF_SUBSTRING)
1700 /* If this is a CHARACTER array and we possibly took
1701 a substring out of it, update the type-spec's
1702 character length according to the first element
1703 (as all should have the same length). */
1704 int string_len;
1705 if ((c = gfc_constructor_first (p->value.constructor)))
1707 const gfc_expr* first = c->expr;
1708 gcc_assert (first->expr_type == EXPR_CONSTANT);
1709 gcc_assert (first->ts.type == BT_CHARACTER);
1710 string_len = first->value.character.length;
1712 else
1713 string_len = 0;
1715 if (!p->ts.u.cl)
1716 p->ts.u.cl = gfc_new_charlen (p->symtree->n.sym->ns,
1717 NULL);
1718 else
1719 gfc_free_expr (p->ts.u.cl->length);
1721 p->ts.u.cl->length
1722 = gfc_get_int_expr (gfc_default_integer_kind,
1723 NULL, string_len);
1726 gfc_free_ref_list (p->ref);
1727 p->ref = NULL;
1728 break;
1730 default:
1731 return true;
1734 break;
1736 case REF_COMPONENT:
1737 cons = find_component_ref (p->value.constructor, p->ref);
1738 remove_subobject_ref (p, cons);
1739 break;
1741 case REF_SUBSTRING:
1742 if (!find_substring_ref (p, &newp))
1743 return false;
1745 gfc_replace_expr (p, newp);
1746 gfc_free_ref_list (p->ref);
1747 p->ref = NULL;
1748 break;
1752 return true;
1756 /* Simplify a chain of references. */
1758 static bool
1759 simplify_ref_chain (gfc_ref *ref, int type)
1761 int n;
1763 for (; ref; ref = ref->next)
1765 switch (ref->type)
1767 case REF_ARRAY:
1768 for (n = 0; n < ref->u.ar.dimen; n++)
1770 if (!gfc_simplify_expr (ref->u.ar.start[n], type))
1771 return false;
1772 if (!gfc_simplify_expr (ref->u.ar.end[n], type))
1773 return false;
1774 if (!gfc_simplify_expr (ref->u.ar.stride[n], type))
1775 return false;
1777 break;
1779 case REF_SUBSTRING:
1780 if (!gfc_simplify_expr (ref->u.ss.start, type))
1781 return false;
1782 if (!gfc_simplify_expr (ref->u.ss.end, type))
1783 return false;
1784 break;
1786 default:
1787 break;
1790 return true;
1794 /* Try to substitute the value of a parameter variable. */
1796 static bool
1797 simplify_parameter_variable (gfc_expr *p, int type)
1799 gfc_expr *e;
1800 bool t;
1802 e = gfc_copy_expr (p->symtree->n.sym->value);
1803 if (e == NULL)
1804 return false;
1806 e->rank = p->rank;
1808 /* Do not copy subobject refs for constant. */
1809 if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1810 e->ref = gfc_copy_ref (p->ref);
1811 t = gfc_simplify_expr (e, type);
1813 /* Only use the simplification if it eliminated all subobject references. */
1814 if (t && !e->ref)
1815 gfc_replace_expr (p, e);
1816 else
1817 gfc_free_expr (e);
1819 return t;
1822 /* Given an expression, simplify it by collapsing constant
1823 expressions. Most simplification takes place when the expression
1824 tree is being constructed. If an intrinsic function is simplified
1825 at some point, we get called again to collapse the result against
1826 other constants.
1828 We work by recursively simplifying expression nodes, simplifying
1829 intrinsic functions where possible, which can lead to further
1830 constant collapsing. If an operator has constant operand(s), we
1831 rip the expression apart, and rebuild it, hoping that it becomes
1832 something simpler.
1834 The expression type is defined for:
1835 0 Basic expression parsing
1836 1 Simplifying array constructors -- will substitute
1837 iterator values.
1838 Returns false on error, true otherwise.
1839 NOTE: Will return true even if the expression can not be simplified. */
1841 bool
1842 gfc_simplify_expr (gfc_expr *p, int type)
1844 gfc_actual_arglist *ap;
1846 if (p == NULL)
1847 return true;
1849 switch (p->expr_type)
1851 case EXPR_CONSTANT:
1852 case EXPR_NULL:
1853 break;
1855 case EXPR_FUNCTION:
1856 for (ap = p->value.function.actual; ap; ap = ap->next)
1857 if (!gfc_simplify_expr (ap->expr, type))
1858 return false;
1860 if (p->value.function.isym != NULL
1861 && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1862 return false;
1864 break;
1866 case EXPR_SUBSTRING:
1867 if (!simplify_ref_chain (p->ref, type))
1868 return false;
1870 if (gfc_is_constant_expr (p))
1872 gfc_char_t *s;
1873 int start, end;
1875 start = 0;
1876 if (p->ref && p->ref->u.ss.start)
1878 gfc_extract_int (p->ref->u.ss.start, &start);
1879 start--; /* Convert from one-based to zero-based. */
1882 end = p->value.character.length;
1883 if (p->ref && p->ref->u.ss.end)
1884 gfc_extract_int (p->ref->u.ss.end, &end);
1886 if (end < start)
1887 end = start;
1889 s = gfc_get_wide_string (end - start + 2);
1890 memcpy (s, p->value.character.string + start,
1891 (end - start) * sizeof (gfc_char_t));
1892 s[end - start + 1] = '\0'; /* TODO: C-style string. */
1893 free (p->value.character.string);
1894 p->value.character.string = s;
1895 p->value.character.length = end - start;
1896 p->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
1897 p->ts.u.cl->length = gfc_get_int_expr (gfc_default_integer_kind,
1898 NULL,
1899 p->value.character.length);
1900 gfc_free_ref_list (p->ref);
1901 p->ref = NULL;
1902 p->expr_type = EXPR_CONSTANT;
1904 break;
1906 case EXPR_OP:
1907 if (!simplify_intrinsic_op (p, type))
1908 return false;
1909 break;
1911 case EXPR_VARIABLE:
1912 /* Only substitute array parameter variables if we are in an
1913 initialization expression, or we want a subsection. */
1914 if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1915 && (gfc_init_expr_flag || p->ref
1916 || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1918 if (!simplify_parameter_variable (p, type))
1919 return false;
1920 break;
1923 if (type == 1)
1925 gfc_simplify_iterator_var (p);
1928 /* Simplify subcomponent references. */
1929 if (!simplify_ref_chain (p->ref, type))
1930 return false;
1932 break;
1934 case EXPR_STRUCTURE:
1935 case EXPR_ARRAY:
1936 if (!simplify_ref_chain (p->ref, type))
1937 return false;
1939 if (!simplify_constructor (p->value.constructor, type))
1940 return false;
1942 if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1943 && p->ref->u.ar.type == AR_FULL)
1944 gfc_expand_constructor (p, false);
1946 if (!simplify_const_ref (p))
1947 return false;
1949 break;
1951 case EXPR_COMPCALL:
1952 case EXPR_PPC:
1953 break;
1956 return true;
1960 /* Returns the type of an expression with the exception that iterator
1961 variables are automatically integers no matter what else they may
1962 be declared as. */
1964 static bt
1965 et0 (gfc_expr *e)
1967 if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e))
1968 return BT_INTEGER;
1970 return e->ts.type;
1974 /* Scalarize an expression for an elemental intrinsic call. */
1976 static bool
1977 scalarize_intrinsic_call (gfc_expr *e)
1979 gfc_actual_arglist *a, *b;
1980 gfc_constructor_base ctor;
1981 gfc_constructor *args[5] = {}; /* Avoid uninitialized warnings. */
1982 gfc_constructor *ci, *new_ctor;
1983 gfc_expr *expr, *old;
1984 int n, i, rank[5], array_arg;
1986 /* Find which, if any, arguments are arrays. Assume that the old
1987 expression carries the type information and that the first arg
1988 that is an array expression carries all the shape information.*/
1989 n = array_arg = 0;
1990 a = e->value.function.actual;
1991 for (; a; a = a->next)
1993 n++;
1994 if (!a->expr || a->expr->expr_type != EXPR_ARRAY)
1995 continue;
1996 array_arg = n;
1997 expr = gfc_copy_expr (a->expr);
1998 break;
2001 if (!array_arg)
2002 return false;
2004 old = gfc_copy_expr (e);
2006 gfc_constructor_free (expr->value.constructor);
2007 expr->value.constructor = NULL;
2008 expr->ts = old->ts;
2009 expr->where = old->where;
2010 expr->expr_type = EXPR_ARRAY;
2012 /* Copy the array argument constructors into an array, with nulls
2013 for the scalars. */
2014 n = 0;
2015 a = old->value.function.actual;
2016 for (; a; a = a->next)
2018 /* Check that this is OK for an initialization expression. */
2019 if (a->expr && !gfc_check_init_expr (a->expr))
2020 goto cleanup;
2022 rank[n] = 0;
2023 if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
2025 rank[n] = a->expr->rank;
2026 ctor = a->expr->symtree->n.sym->value->value.constructor;
2027 args[n] = gfc_constructor_first (ctor);
2029 else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
2031 if (a->expr->rank)
2032 rank[n] = a->expr->rank;
2033 else
2034 rank[n] = 1;
2035 ctor = gfc_constructor_copy (a->expr->value.constructor);
2036 args[n] = gfc_constructor_first (ctor);
2038 else
2039 args[n] = NULL;
2041 n++;
2045 /* Using the array argument as the master, step through the array
2046 calling the function for each element and advancing the array
2047 constructors together. */
2048 for (ci = args[array_arg - 1]; ci; ci = gfc_constructor_next (ci))
2050 new_ctor = gfc_constructor_append_expr (&expr->value.constructor,
2051 gfc_copy_expr (old), NULL);
2053 gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
2054 a = NULL;
2055 b = old->value.function.actual;
2056 for (i = 0; i < n; i++)
2058 if (a == NULL)
2059 new_ctor->expr->value.function.actual
2060 = a = gfc_get_actual_arglist ();
2061 else
2063 a->next = gfc_get_actual_arglist ();
2064 a = a->next;
2067 if (args[i])
2068 a->expr = gfc_copy_expr (args[i]->expr);
2069 else
2070 a->expr = gfc_copy_expr (b->expr);
2072 b = b->next;
2075 /* Simplify the function calls. If the simplification fails, the
2076 error will be flagged up down-stream or the library will deal
2077 with it. */
2078 gfc_simplify_expr (new_ctor->expr, 0);
2080 for (i = 0; i < n; i++)
2081 if (args[i])
2082 args[i] = gfc_constructor_next (args[i]);
2084 for (i = 1; i < n; i++)
2085 if (rank[i] && ((args[i] != NULL && args[array_arg - 1] == NULL)
2086 || (args[i] == NULL && args[array_arg - 1] != NULL)))
2087 goto compliance;
2090 free_expr0 (e);
2091 *e = *expr;
2092 /* Free "expr" but not the pointers it contains. */
2093 free (expr);
2094 gfc_free_expr (old);
2095 return true;
2097 compliance:
2098 gfc_error_now ("elemental function arguments at %C are not compliant");
2100 cleanup:
2101 gfc_free_expr (expr);
2102 gfc_free_expr (old);
2103 return false;
2107 static bool
2108 check_intrinsic_op (gfc_expr *e, bool (*check_function) (gfc_expr *))
2110 gfc_expr *op1 = e->value.op.op1;
2111 gfc_expr *op2 = e->value.op.op2;
2113 if (!(*check_function)(op1))
2114 return false;
2116 switch (e->value.op.op)
2118 case INTRINSIC_UPLUS:
2119 case INTRINSIC_UMINUS:
2120 if (!numeric_type (et0 (op1)))
2121 goto not_numeric;
2122 break;
2124 case INTRINSIC_EQ:
2125 case INTRINSIC_EQ_OS:
2126 case INTRINSIC_NE:
2127 case INTRINSIC_NE_OS:
2128 case INTRINSIC_GT:
2129 case INTRINSIC_GT_OS:
2130 case INTRINSIC_GE:
2131 case INTRINSIC_GE_OS:
2132 case INTRINSIC_LT:
2133 case INTRINSIC_LT_OS:
2134 case INTRINSIC_LE:
2135 case INTRINSIC_LE_OS:
2136 if (!(*check_function)(op2))
2137 return false;
2139 if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
2140 && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
2142 gfc_error ("Numeric or CHARACTER operands are required in "
2143 "expression at %L", &e->where);
2144 return false;
2146 break;
2148 case INTRINSIC_PLUS:
2149 case INTRINSIC_MINUS:
2150 case INTRINSIC_TIMES:
2151 case INTRINSIC_DIVIDE:
2152 case INTRINSIC_POWER:
2153 if (!(*check_function)(op2))
2154 return false;
2156 if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
2157 goto not_numeric;
2159 break;
2161 case INTRINSIC_CONCAT:
2162 if (!(*check_function)(op2))
2163 return false;
2165 if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
2167 gfc_error ("Concatenation operator in expression at %L "
2168 "must have two CHARACTER operands", &op1->where);
2169 return false;
2172 if (op1->ts.kind != op2->ts.kind)
2174 gfc_error ("Concat operator at %L must concatenate strings of the "
2175 "same kind", &e->where);
2176 return false;
2179 break;
2181 case INTRINSIC_NOT:
2182 if (et0 (op1) != BT_LOGICAL)
2184 gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
2185 "operand", &op1->where);
2186 return false;
2189 break;
2191 case INTRINSIC_AND:
2192 case INTRINSIC_OR:
2193 case INTRINSIC_EQV:
2194 case INTRINSIC_NEQV:
2195 if (!(*check_function)(op2))
2196 return false;
2198 if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
2200 gfc_error ("LOGICAL operands are required in expression at %L",
2201 &e->where);
2202 return false;
2205 break;
2207 case INTRINSIC_PARENTHESES:
2208 break;
2210 default:
2211 gfc_error ("Only intrinsic operators can be used in expression at %L",
2212 &e->where);
2213 return false;
2216 return true;
2218 not_numeric:
2219 gfc_error ("Numeric operands are required in expression at %L", &e->where);
2221 return false;
2224 /* F2003, 7.1.7 (3): In init expression, allocatable components
2225 must not be data-initialized. */
2226 static bool
2227 check_alloc_comp_init (gfc_expr *e)
2229 gfc_component *comp;
2230 gfc_constructor *ctor;
2232 gcc_assert (e->expr_type == EXPR_STRUCTURE);
2233 gcc_assert (e->ts.type == BT_DERIVED || e->ts.type == BT_CLASS);
2235 for (comp = e->ts.u.derived->components,
2236 ctor = gfc_constructor_first (e->value.constructor);
2237 comp; comp = comp->next, ctor = gfc_constructor_next (ctor))
2239 if (comp->attr.allocatable && ctor->expr
2240 && ctor->expr->expr_type != EXPR_NULL)
2242 gfc_error ("Invalid initialization expression for ALLOCATABLE "
2243 "component %qs in structure constructor at %L",
2244 comp->name, &ctor->expr->where);
2245 return false;
2249 return true;
2252 static match
2253 check_init_expr_arguments (gfc_expr *e)
2255 gfc_actual_arglist *ap;
2257 for (ap = e->value.function.actual; ap; ap = ap->next)
2258 if (!gfc_check_init_expr (ap->expr))
2259 return MATCH_ERROR;
2261 return MATCH_YES;
2264 static bool check_restricted (gfc_expr *);
2266 /* F95, 7.1.6.1, Initialization expressions, (7)
2267 F2003, 7.1.7 Initialization expression, (8) */
2269 static match
2270 check_inquiry (gfc_expr *e, int not_restricted)
2272 const char *name;
2273 const char *const *functions;
2275 static const char *const inquiry_func_f95[] = {
2276 "lbound", "shape", "size", "ubound",
2277 "bit_size", "len", "kind",
2278 "digits", "epsilon", "huge", "maxexponent", "minexponent",
2279 "precision", "radix", "range", "tiny",
2280 NULL
2283 static const char *const inquiry_func_f2003[] = {
2284 "lbound", "shape", "size", "ubound",
2285 "bit_size", "len", "kind",
2286 "digits", "epsilon", "huge", "maxexponent", "minexponent",
2287 "precision", "radix", "range", "tiny",
2288 "new_line", NULL
2291 int i = 0;
2292 gfc_actual_arglist *ap;
2294 if (!e->value.function.isym
2295 || !e->value.function.isym->inquiry)
2296 return MATCH_NO;
2298 /* An undeclared parameter will get us here (PR25018). */
2299 if (e->symtree == NULL)
2300 return MATCH_NO;
2302 if (e->symtree->n.sym->from_intmod)
2304 if (e->symtree->n.sym->from_intmod == INTMOD_ISO_FORTRAN_ENV
2305 && e->symtree->n.sym->intmod_sym_id != ISOFORTRAN_COMPILER_OPTIONS
2306 && e->symtree->n.sym->intmod_sym_id != ISOFORTRAN_COMPILER_VERSION)
2307 return MATCH_NO;
2309 if (e->symtree->n.sym->from_intmod == INTMOD_ISO_C_BINDING
2310 && e->symtree->n.sym->intmod_sym_id != ISOCBINDING_C_SIZEOF)
2311 return MATCH_NO;
2313 else
2315 name = e->symtree->n.sym->name;
2317 functions = (gfc_option.warn_std & GFC_STD_F2003)
2318 ? inquiry_func_f2003 : inquiry_func_f95;
2320 for (i = 0; functions[i]; i++)
2321 if (strcmp (functions[i], name) == 0)
2322 break;
2324 if (functions[i] == NULL)
2325 return MATCH_ERROR;
2328 /* At this point we have an inquiry function with a variable argument. The
2329 type of the variable might be undefined, but we need it now, because the
2330 arguments of these functions are not allowed to be undefined. */
2332 for (ap = e->value.function.actual; ap; ap = ap->next)
2334 if (!ap->expr)
2335 continue;
2337 if (ap->expr->ts.type == BT_UNKNOWN)
2339 if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
2340 && !gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns))
2341 return MATCH_NO;
2343 ap->expr->ts = ap->expr->symtree->n.sym->ts;
2346 /* Assumed character length will not reduce to a constant expression
2347 with LEN, as required by the standard. */
2348 if (i == 5 && not_restricted
2349 && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
2350 && (ap->expr->symtree->n.sym->ts.u.cl->length == NULL
2351 || ap->expr->symtree->n.sym->ts.deferred))
2353 gfc_error ("Assumed or deferred character length variable %qs "
2354 "in constant expression at %L",
2355 ap->expr->symtree->n.sym->name,
2356 &ap->expr->where);
2357 return MATCH_ERROR;
2359 else if (not_restricted && !gfc_check_init_expr (ap->expr))
2360 return MATCH_ERROR;
2362 if (not_restricted == 0
2363 && ap->expr->expr_type != EXPR_VARIABLE
2364 && !check_restricted (ap->expr))
2365 return MATCH_ERROR;
2367 if (not_restricted == 0
2368 && ap->expr->expr_type == EXPR_VARIABLE
2369 && ap->expr->symtree->n.sym->attr.dummy
2370 && ap->expr->symtree->n.sym->attr.optional)
2371 return MATCH_NO;
2374 return MATCH_YES;
2378 /* F95, 7.1.6.1, Initialization expressions, (5)
2379 F2003, 7.1.7 Initialization expression, (5) */
2381 static match
2382 check_transformational (gfc_expr *e)
2384 static const char * const trans_func_f95[] = {
2385 "repeat", "reshape", "selected_int_kind",
2386 "selected_real_kind", "transfer", "trim", NULL
2389 static const char * const trans_func_f2003[] = {
2390 "all", "any", "count", "dot_product", "matmul", "null", "pack",
2391 "product", "repeat", "reshape", "selected_char_kind", "selected_int_kind",
2392 "selected_real_kind", "spread", "sum", "transfer", "transpose",
2393 "trim", "unpack", NULL
2396 int i;
2397 const char *name;
2398 const char *const *functions;
2400 if (!e->value.function.isym
2401 || !e->value.function.isym->transformational)
2402 return MATCH_NO;
2404 name = e->symtree->n.sym->name;
2406 functions = (gfc_option.allow_std & GFC_STD_F2003)
2407 ? trans_func_f2003 : trans_func_f95;
2409 /* NULL() is dealt with below. */
2410 if (strcmp ("null", name) == 0)
2411 return MATCH_NO;
2413 for (i = 0; functions[i]; i++)
2414 if (strcmp (functions[i], name) == 0)
2415 break;
2417 if (functions[i] == NULL)
2419 gfc_error ("transformational intrinsic %qs at %L is not permitted "
2420 "in an initialization expression", name, &e->where);
2421 return MATCH_ERROR;
2424 return check_init_expr_arguments (e);
2428 /* F95, 7.1.6.1, Initialization expressions, (6)
2429 F2003, 7.1.7 Initialization expression, (6) */
2431 static match
2432 check_null (gfc_expr *e)
2434 if (strcmp ("null", e->symtree->n.sym->name) != 0)
2435 return MATCH_NO;
2437 return check_init_expr_arguments (e);
2441 static match
2442 check_elemental (gfc_expr *e)
2444 if (!e->value.function.isym
2445 || !e->value.function.isym->elemental)
2446 return MATCH_NO;
2448 if (e->ts.type != BT_INTEGER
2449 && e->ts.type != BT_CHARACTER
2450 && !gfc_notify_std (GFC_STD_F2003, "Evaluation of nonstandard "
2451 "initialization expression at %L", &e->where))
2452 return MATCH_ERROR;
2454 return check_init_expr_arguments (e);
2458 static match
2459 check_conversion (gfc_expr *e)
2461 if (!e->value.function.isym
2462 || !e->value.function.isym->conversion)
2463 return MATCH_NO;
2465 return check_init_expr_arguments (e);
2469 /* Verify that an expression is an initialization expression. A side
2470 effect is that the expression tree is reduced to a single constant
2471 node if all goes well. This would normally happen when the
2472 expression is constructed but function references are assumed to be
2473 intrinsics in the context of initialization expressions. If
2474 false is returned an error message has been generated. */
2476 bool
2477 gfc_check_init_expr (gfc_expr *e)
2479 match m;
2480 bool t;
2482 if (e == NULL)
2483 return true;
2485 switch (e->expr_type)
2487 case EXPR_OP:
2488 t = check_intrinsic_op (e, gfc_check_init_expr);
2489 if (t)
2490 t = gfc_simplify_expr (e, 0);
2492 break;
2494 case EXPR_FUNCTION:
2495 t = false;
2498 bool conversion;
2499 gfc_intrinsic_sym* isym = NULL;
2500 gfc_symbol* sym = e->symtree->n.sym;
2502 /* Simplify here the intrinsics from the IEEE_ARITHMETIC and
2503 IEEE_EXCEPTIONS modules. */
2504 int mod = sym->from_intmod;
2505 if (mod == INTMOD_NONE && sym->generic)
2506 mod = sym->generic->sym->from_intmod;
2507 if (mod == INTMOD_IEEE_ARITHMETIC || mod == INTMOD_IEEE_EXCEPTIONS)
2509 gfc_expr *new_expr = gfc_simplify_ieee_functions (e);
2510 if (new_expr)
2512 gfc_replace_expr (e, new_expr);
2513 t = true;
2514 break;
2518 /* If a conversion function, e.g., __convert_i8_i4, was inserted
2519 into an array constructor, we need to skip the error check here.
2520 Conversion errors are caught below in scalarize_intrinsic_call. */
2521 conversion = e->value.function.isym
2522 && (e->value.function.isym->conversion == 1);
2524 if (!conversion && (!gfc_is_intrinsic (sym, 0, e->where)
2525 || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES))
2527 gfc_error ("Function %qs in initialization expression at %L "
2528 "must be an intrinsic function",
2529 e->symtree->n.sym->name, &e->where);
2530 break;
2533 if ((m = check_conversion (e)) == MATCH_NO
2534 && (m = check_inquiry (e, 1)) == MATCH_NO
2535 && (m = check_null (e)) == MATCH_NO
2536 && (m = check_transformational (e)) == MATCH_NO
2537 && (m = check_elemental (e)) == MATCH_NO)
2539 gfc_error ("Intrinsic function %qs at %L is not permitted "
2540 "in an initialization expression",
2541 e->symtree->n.sym->name, &e->where);
2542 m = MATCH_ERROR;
2545 if (m == MATCH_ERROR)
2546 return false;
2548 /* Try to scalarize an elemental intrinsic function that has an
2549 array argument. */
2550 isym = gfc_find_function (e->symtree->n.sym->name);
2551 if (isym && isym->elemental
2552 && (t = scalarize_intrinsic_call (e)))
2553 break;
2556 if (m == MATCH_YES)
2557 t = gfc_simplify_expr (e, 0);
2559 break;
2561 case EXPR_VARIABLE:
2562 t = true;
2564 /* This occurs when parsing pdt templates. */
2565 if (gfc_expr_attr (e).pdt_kind)
2566 break;
2568 if (gfc_check_iter_variable (e))
2569 break;
2571 if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2573 /* A PARAMETER shall not be used to define itself, i.e.
2574 REAL, PARAMETER :: x = transfer(0, x)
2575 is invalid. */
2576 if (!e->symtree->n.sym->value)
2578 gfc_error ("PARAMETER %qs is used at %L before its definition "
2579 "is complete", e->symtree->n.sym->name, &e->where);
2580 t = false;
2582 else
2583 t = simplify_parameter_variable (e, 0);
2585 break;
2588 if (gfc_in_match_data ())
2589 break;
2591 t = false;
2593 if (e->symtree->n.sym->as)
2595 switch (e->symtree->n.sym->as->type)
2597 case AS_ASSUMED_SIZE:
2598 gfc_error ("Assumed size array %qs at %L is not permitted "
2599 "in an initialization expression",
2600 e->symtree->n.sym->name, &e->where);
2601 break;
2603 case AS_ASSUMED_SHAPE:
2604 gfc_error ("Assumed shape array %qs at %L is not permitted "
2605 "in an initialization expression",
2606 e->symtree->n.sym->name, &e->where);
2607 break;
2609 case AS_DEFERRED:
2610 gfc_error ("Deferred array %qs at %L is not permitted "
2611 "in an initialization expression",
2612 e->symtree->n.sym->name, &e->where);
2613 break;
2615 case AS_EXPLICIT:
2616 gfc_error ("Array %qs at %L is a variable, which does "
2617 "not reduce to a constant expression",
2618 e->symtree->n.sym->name, &e->where);
2619 break;
2621 default:
2622 gcc_unreachable();
2625 else
2626 gfc_error ("Parameter %qs at %L has not been declared or is "
2627 "a variable, which does not reduce to a constant "
2628 "expression", e->symtree->name, &e->where);
2630 break;
2632 case EXPR_CONSTANT:
2633 case EXPR_NULL:
2634 t = true;
2635 break;
2637 case EXPR_SUBSTRING:
2638 if (e->ref)
2640 t = gfc_check_init_expr (e->ref->u.ss.start);
2641 if (!t)
2642 break;
2644 t = gfc_check_init_expr (e->ref->u.ss.end);
2645 if (t)
2646 t = gfc_simplify_expr (e, 0);
2648 else
2649 t = false;
2650 break;
2652 case EXPR_STRUCTURE:
2653 t = e->ts.is_iso_c ? true : false;
2654 if (t)
2655 break;
2657 t = check_alloc_comp_init (e);
2658 if (!t)
2659 break;
2661 t = gfc_check_constructor (e, gfc_check_init_expr);
2662 if (!t)
2663 break;
2665 break;
2667 case EXPR_ARRAY:
2668 t = gfc_check_constructor (e, gfc_check_init_expr);
2669 if (!t)
2670 break;
2672 t = gfc_expand_constructor (e, true);
2673 if (!t)
2674 break;
2676 t = gfc_check_constructor_type (e);
2677 break;
2679 default:
2680 gfc_internal_error ("check_init_expr(): Unknown expression type");
2683 return t;
2686 /* Reduces a general expression to an initialization expression (a constant).
2687 This used to be part of gfc_match_init_expr.
2688 Note that this function doesn't free the given expression on false. */
2690 bool
2691 gfc_reduce_init_expr (gfc_expr *expr)
2693 bool t;
2695 gfc_init_expr_flag = true;
2696 t = gfc_resolve_expr (expr);
2697 if (t)
2698 t = gfc_check_init_expr (expr);
2699 gfc_init_expr_flag = false;
2701 if (!t)
2702 return false;
2704 if (expr->expr_type == EXPR_ARRAY)
2706 if (!gfc_check_constructor_type (expr))
2707 return false;
2708 if (!gfc_expand_constructor (expr, true))
2709 return false;
2712 return true;
2716 /* Match an initialization expression. We work by first matching an
2717 expression, then reducing it to a constant. */
2719 match
2720 gfc_match_init_expr (gfc_expr **result)
2722 gfc_expr *expr;
2723 match m;
2724 bool t;
2726 expr = NULL;
2728 gfc_init_expr_flag = true;
2730 m = gfc_match_expr (&expr);
2731 if (m != MATCH_YES)
2733 gfc_init_expr_flag = false;
2734 return m;
2737 if (gfc_derived_parameter_expr (expr))
2739 *result = expr;
2740 gfc_init_expr_flag = false;
2741 return m;
2744 t = gfc_reduce_init_expr (expr);
2745 if (!t)
2747 gfc_free_expr (expr);
2748 gfc_init_expr_flag = false;
2749 return MATCH_ERROR;
2752 *result = expr;
2753 gfc_init_expr_flag = false;
2755 return MATCH_YES;
2759 /* Given an actual argument list, test to see that each argument is a
2760 restricted expression and optionally if the expression type is
2761 integer or character. */
2763 static bool
2764 restricted_args (gfc_actual_arglist *a)
2766 for (; a; a = a->next)
2768 if (!check_restricted (a->expr))
2769 return false;
2772 return true;
2776 /************* Restricted/specification expressions *************/
2779 /* Make sure a non-intrinsic function is a specification function,
2780 * see F08:7.1.11.5. */
2782 static bool
2783 external_spec_function (gfc_expr *e)
2785 gfc_symbol *f;
2787 f = e->value.function.esym;
2789 /* IEEE functions allowed are "a reference to a transformational function
2790 from the intrinsic module IEEE_ARITHMETIC or IEEE_EXCEPTIONS", and
2791 "inquiry function from the intrinsic modules IEEE_ARITHMETIC and
2792 IEEE_EXCEPTIONS". */
2793 if (f->from_intmod == INTMOD_IEEE_ARITHMETIC
2794 || f->from_intmod == INTMOD_IEEE_EXCEPTIONS)
2796 if (!strcmp (f->name, "ieee_selected_real_kind")
2797 || !strcmp (f->name, "ieee_support_rounding")
2798 || !strcmp (f->name, "ieee_support_flag")
2799 || !strcmp (f->name, "ieee_support_halting")
2800 || !strcmp (f->name, "ieee_support_datatype")
2801 || !strcmp (f->name, "ieee_support_denormal")
2802 || !strcmp (f->name, "ieee_support_divide")
2803 || !strcmp (f->name, "ieee_support_inf")
2804 || !strcmp (f->name, "ieee_support_io")
2805 || !strcmp (f->name, "ieee_support_nan")
2806 || !strcmp (f->name, "ieee_support_sqrt")
2807 || !strcmp (f->name, "ieee_support_standard")
2808 || !strcmp (f->name, "ieee_support_underflow_control"))
2809 goto function_allowed;
2812 if (f->attr.proc == PROC_ST_FUNCTION)
2814 gfc_error ("Specification function %qs at %L cannot be a statement "
2815 "function", f->name, &e->where);
2816 return false;
2819 if (f->attr.proc == PROC_INTERNAL)
2821 gfc_error ("Specification function %qs at %L cannot be an internal "
2822 "function", f->name, &e->where);
2823 return false;
2826 if (!f->attr.pure && !f->attr.elemental)
2828 gfc_error ("Specification function %qs at %L must be PURE", f->name,
2829 &e->where);
2830 return false;
2833 /* F08:7.1.11.6. */
2834 if (f->attr.recursive
2835 && !gfc_notify_std (GFC_STD_F2003,
2836 "Specification function %qs "
2837 "at %L cannot be RECURSIVE", f->name, &e->where))
2838 return false;
2840 function_allowed:
2841 return restricted_args (e->value.function.actual);
2845 /* Check to see that a function reference to an intrinsic is a
2846 restricted expression. */
2848 static bool
2849 restricted_intrinsic (gfc_expr *e)
2851 /* TODO: Check constraints on inquiry functions. 7.1.6.2 (7). */
2852 if (check_inquiry (e, 0) == MATCH_YES)
2853 return true;
2855 return restricted_args (e->value.function.actual);
2859 /* Check the expressions of an actual arglist. Used by check_restricted. */
2861 static bool
2862 check_arglist (gfc_actual_arglist* arg, bool (*checker) (gfc_expr*))
2864 for (; arg; arg = arg->next)
2865 if (!checker (arg->expr))
2866 return false;
2868 return true;
2872 /* Check the subscription expressions of a reference chain with a checking
2873 function; used by check_restricted. */
2875 static bool
2876 check_references (gfc_ref* ref, bool (*checker) (gfc_expr*))
2878 int dim;
2880 if (!ref)
2881 return true;
2883 switch (ref->type)
2885 case REF_ARRAY:
2886 for (dim = 0; dim != ref->u.ar.dimen; ++dim)
2888 if (!checker (ref->u.ar.start[dim]))
2889 return false;
2890 if (!checker (ref->u.ar.end[dim]))
2891 return false;
2892 if (!checker (ref->u.ar.stride[dim]))
2893 return false;
2895 break;
2897 case REF_COMPONENT:
2898 /* Nothing needed, just proceed to next reference. */
2899 break;
2901 case REF_SUBSTRING:
2902 if (!checker (ref->u.ss.start))
2903 return false;
2904 if (!checker (ref->u.ss.end))
2905 return false;
2906 break;
2908 default:
2909 gcc_unreachable ();
2910 break;
2913 return check_references (ref->next, checker);
2916 /* Return true if ns is a parent of the current ns. */
2918 static bool
2919 is_parent_of_current_ns (gfc_namespace *ns)
2921 gfc_namespace *p;
2922 for (p = gfc_current_ns->parent; p; p = p->parent)
2923 if (ns == p)
2924 return true;
2926 return false;
2929 /* Verify that an expression is a restricted expression. Like its
2930 cousin check_init_expr(), an error message is generated if we
2931 return false. */
2933 static bool
2934 check_restricted (gfc_expr *e)
2936 gfc_symbol* sym;
2937 bool t;
2939 if (e == NULL)
2940 return true;
2942 switch (e->expr_type)
2944 case EXPR_OP:
2945 t = check_intrinsic_op (e, check_restricted);
2946 if (t)
2947 t = gfc_simplify_expr (e, 0);
2949 break;
2951 case EXPR_FUNCTION:
2952 if (e->value.function.esym)
2954 t = check_arglist (e->value.function.actual, &check_restricted);
2955 if (t)
2956 t = external_spec_function (e);
2958 else
2960 if (e->value.function.isym && e->value.function.isym->inquiry)
2961 t = true;
2962 else
2963 t = check_arglist (e->value.function.actual, &check_restricted);
2965 if (t)
2966 t = restricted_intrinsic (e);
2968 break;
2970 case EXPR_VARIABLE:
2971 sym = e->symtree->n.sym;
2972 t = false;
2974 /* If a dummy argument appears in a context that is valid for a
2975 restricted expression in an elemental procedure, it will have
2976 already been simplified away once we get here. Therefore we
2977 don't need to jump through hoops to distinguish valid from
2978 invalid cases. */
2979 if (sym->attr.dummy && sym->ns == gfc_current_ns
2980 && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
2982 gfc_error ("Dummy argument %qs not allowed in expression at %L",
2983 sym->name, &e->where);
2984 break;
2987 if (sym->attr.optional)
2989 gfc_error ("Dummy argument %qs at %L cannot be OPTIONAL",
2990 sym->name, &e->where);
2991 break;
2994 if (sym->attr.intent == INTENT_OUT)
2996 gfc_error ("Dummy argument %qs at %L cannot be INTENT(OUT)",
2997 sym->name, &e->where);
2998 break;
3001 /* Check reference chain if any. */
3002 if (!check_references (e->ref, &check_restricted))
3003 break;
3005 /* gfc_is_formal_arg broadcasts that a formal argument list is being
3006 processed in resolve.c(resolve_formal_arglist). This is done so
3007 that host associated dummy array indices are accepted (PR23446).
3008 This mechanism also does the same for the specification expressions
3009 of array-valued functions. */
3010 if (e->error
3011 || sym->attr.in_common
3012 || sym->attr.use_assoc
3013 || sym->attr.dummy
3014 || sym->attr.implied_index
3015 || sym->attr.flavor == FL_PARAMETER
3016 || is_parent_of_current_ns (sym->ns)
3017 || (sym->ns->proc_name != NULL
3018 && sym->ns->proc_name->attr.flavor == FL_MODULE)
3019 || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
3021 t = true;
3022 break;
3025 gfc_error ("Variable %qs cannot appear in the expression at %L",
3026 sym->name, &e->where);
3027 /* Prevent a repetition of the error. */
3028 e->error = 1;
3029 break;
3031 case EXPR_NULL:
3032 case EXPR_CONSTANT:
3033 t = true;
3034 break;
3036 case EXPR_SUBSTRING:
3037 t = gfc_specification_expr (e->ref->u.ss.start);
3038 if (!t)
3039 break;
3041 t = gfc_specification_expr (e->ref->u.ss.end);
3042 if (t)
3043 t = gfc_simplify_expr (e, 0);
3045 break;
3047 case EXPR_STRUCTURE:
3048 t = gfc_check_constructor (e, check_restricted);
3049 break;
3051 case EXPR_ARRAY:
3052 t = gfc_check_constructor (e, check_restricted);
3053 break;
3055 default:
3056 gfc_internal_error ("check_restricted(): Unknown expression type");
3059 return t;
3063 /* Check to see that an expression is a specification expression. If
3064 we return false, an error has been generated. */
3066 bool
3067 gfc_specification_expr (gfc_expr *e)
3069 gfc_component *comp;
3071 if (e == NULL)
3072 return true;
3074 if (e->ts.type != BT_INTEGER)
3076 gfc_error ("Expression at %L must be of INTEGER type, found %s",
3077 &e->where, gfc_basic_typename (e->ts.type));
3078 return false;
3081 comp = gfc_get_proc_ptr_comp (e);
3082 if (e->expr_type == EXPR_FUNCTION
3083 && !e->value.function.isym
3084 && !e->value.function.esym
3085 && !gfc_pure (e->symtree->n.sym)
3086 && (!comp || !comp->attr.pure))
3088 gfc_error ("Function %qs at %L must be PURE",
3089 e->symtree->n.sym->name, &e->where);
3090 /* Prevent repeat error messages. */
3091 e->symtree->n.sym->attr.pure = 1;
3092 return false;
3095 if (e->rank != 0)
3097 gfc_error ("Expression at %L must be scalar", &e->where);
3098 return false;
3101 if (!gfc_simplify_expr (e, 0))
3102 return false;
3104 return check_restricted (e);
3108 /************** Expression conformance checks. *************/
3110 /* Given two expressions, make sure that the arrays are conformable. */
3112 bool
3113 gfc_check_conformance (gfc_expr *op1, gfc_expr *op2, const char *optype_msgid, ...)
3115 int op1_flag, op2_flag, d;
3116 mpz_t op1_size, op2_size;
3117 bool t;
3119 va_list argp;
3120 char buffer[240];
3122 if (op1->rank == 0 || op2->rank == 0)
3123 return true;
3125 va_start (argp, optype_msgid);
3126 vsnprintf (buffer, 240, optype_msgid, argp);
3127 va_end (argp);
3129 if (op1->rank != op2->rank)
3131 gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(buffer),
3132 op1->rank, op2->rank, &op1->where);
3133 return false;
3136 t = true;
3138 for (d = 0; d < op1->rank; d++)
3140 op1_flag = gfc_array_dimen_size(op1, d, &op1_size);
3141 op2_flag = gfc_array_dimen_size(op2, d, &op2_size);
3143 if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
3145 gfc_error ("Different shape for %s at %L on dimension %d "
3146 "(%d and %d)", _(buffer), &op1->where, d + 1,
3147 (int) mpz_get_si (op1_size),
3148 (int) mpz_get_si (op2_size));
3150 t = false;
3153 if (op1_flag)
3154 mpz_clear (op1_size);
3155 if (op2_flag)
3156 mpz_clear (op2_size);
3158 if (!t)
3159 return false;
3162 return true;
3166 /* Given an assignable expression and an arbitrary expression, make
3167 sure that the assignment can take place. Only add a call to the intrinsic
3168 conversion routines, when allow_convert is set. When this assign is a
3169 coarray call, then the convert is done by the coarray routine implictly and
3170 adding the intrinsic conversion would do harm in most cases. */
3172 bool
3173 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform,
3174 bool allow_convert)
3176 gfc_symbol *sym;
3177 gfc_ref *ref;
3178 int has_pointer;
3180 sym = lvalue->symtree->n.sym;
3182 /* See if this is the component or subcomponent of a pointer. */
3183 has_pointer = sym->attr.pointer;
3184 for (ref = lvalue->ref; ref; ref = ref->next)
3185 if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
3187 has_pointer = 1;
3188 break;
3191 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
3192 variable local to a function subprogram. Its existence begins when
3193 execution of the function is initiated and ends when execution of the
3194 function is terminated...
3195 Therefore, the left hand side is no longer a variable, when it is: */
3196 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
3197 && !sym->attr.external)
3199 bool bad_proc;
3200 bad_proc = false;
3202 /* (i) Use associated; */
3203 if (sym->attr.use_assoc)
3204 bad_proc = true;
3206 /* (ii) The assignment is in the main program; or */
3207 if (gfc_current_ns->proc_name
3208 && gfc_current_ns->proc_name->attr.is_main_program)
3209 bad_proc = true;
3211 /* (iii) A module or internal procedure... */
3212 if (gfc_current_ns->proc_name
3213 && (gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
3214 || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
3215 && gfc_current_ns->parent
3216 && (!(gfc_current_ns->parent->proc_name->attr.function
3217 || gfc_current_ns->parent->proc_name->attr.subroutine)
3218 || gfc_current_ns->parent->proc_name->attr.is_main_program))
3220 /* ... that is not a function... */
3221 if (gfc_current_ns->proc_name
3222 && !gfc_current_ns->proc_name->attr.function)
3223 bad_proc = true;
3225 /* ... or is not an entry and has a different name. */
3226 if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
3227 bad_proc = true;
3230 /* (iv) Host associated and not the function symbol or the
3231 parent result. This picks up sibling references, which
3232 cannot be entries. */
3233 if (!sym->attr.entry
3234 && sym->ns == gfc_current_ns->parent
3235 && sym != gfc_current_ns->proc_name
3236 && sym != gfc_current_ns->parent->proc_name->result)
3237 bad_proc = true;
3239 if (bad_proc)
3241 gfc_error ("%qs at %L is not a VALUE", sym->name, &lvalue->where);
3242 return false;
3246 if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
3248 gfc_error ("Incompatible ranks %d and %d in assignment at %L",
3249 lvalue->rank, rvalue->rank, &lvalue->where);
3250 return false;
3253 if (lvalue->ts.type == BT_UNKNOWN)
3255 gfc_error ("Variable type is UNKNOWN in assignment at %L",
3256 &lvalue->where);
3257 return false;
3260 if (rvalue->expr_type == EXPR_NULL)
3262 if (has_pointer && (ref == NULL || ref->next == NULL)
3263 && lvalue->symtree->n.sym->attr.data)
3264 return true;
3265 else
3267 gfc_error ("NULL appears on right-hand side in assignment at %L",
3268 &rvalue->where);
3269 return false;
3273 /* This is possibly a typo: x = f() instead of x => f(). */
3274 if (warn_surprising
3275 && rvalue->expr_type == EXPR_FUNCTION && gfc_expr_attr (rvalue).pointer)
3276 gfc_warning (OPT_Wsurprising,
3277 "POINTER-valued function appears on right-hand side of "
3278 "assignment at %L", &rvalue->where);
3280 /* Check size of array assignments. */
3281 if (lvalue->rank != 0 && rvalue->rank != 0
3282 && !gfc_check_conformance (lvalue, rvalue, "array assignment"))
3283 return false;
3285 if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
3286 && lvalue->symtree->n.sym->attr.data
3287 && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L used to "
3288 "initialize non-integer variable %qs",
3289 &rvalue->where, lvalue->symtree->n.sym->name))
3290 return false;
3291 else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
3292 && !gfc_notify_std (GFC_STD_GNU, "BOZ literal at %L outside "
3293 "a DATA statement and outside INT/REAL/DBLE/CMPLX",
3294 &rvalue->where))
3295 return false;
3297 /* Handle the case of a BOZ literal on the RHS. */
3298 if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
3300 int rc;
3301 if (warn_surprising)
3302 gfc_warning (OPT_Wsurprising,
3303 "BOZ literal at %L is bitwise transferred "
3304 "non-integer symbol %qs", &rvalue->where,
3305 lvalue->symtree->n.sym->name);
3306 if (!gfc_convert_boz (rvalue, &lvalue->ts))
3307 return false;
3308 if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
3310 if (rc == ARITH_UNDERFLOW)
3311 gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
3312 ". This check can be disabled with the option "
3313 "%<-fno-range-check%>", &rvalue->where);
3314 else if (rc == ARITH_OVERFLOW)
3315 gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
3316 ". This check can be disabled with the option "
3317 "%<-fno-range-check%>", &rvalue->where);
3318 else if (rc == ARITH_NAN)
3319 gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
3320 ". This check can be disabled with the option "
3321 "%<-fno-range-check%>", &rvalue->where);
3322 return false;
3326 if (gfc_expr_attr (lvalue).pdt_kind || gfc_expr_attr (lvalue).pdt_len)
3328 gfc_error ("The assignment to a KIND or LEN component of a "
3329 "parameterized type at %L is not allowed",
3330 &lvalue->where);
3331 return false;
3334 if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
3335 return true;
3337 /* Only DATA Statements come here. */
3338 if (!conform)
3340 /* Numeric can be converted to any other numeric. And Hollerith can be
3341 converted to any other type. */
3342 if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
3343 || rvalue->ts.type == BT_HOLLERITH)
3344 return true;
3346 if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
3347 return true;
3349 gfc_error ("Incompatible types in DATA statement at %L; attempted "
3350 "conversion of %s to %s", &lvalue->where,
3351 gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3353 return false;
3356 /* Assignment is the only case where character variables of different
3357 kind values can be converted into one another. */
3358 if (lvalue->ts.type == BT_CHARACTER && rvalue->ts.type == BT_CHARACTER)
3360 if (lvalue->ts.kind != rvalue->ts.kind && allow_convert)
3361 return gfc_convert_chartype (rvalue, &lvalue->ts);
3362 else
3363 return true;
3366 if (!allow_convert)
3367 return true;
3369 return gfc_convert_type (rvalue, &lvalue->ts, 1);
3373 /* Check that a pointer assignment is OK. We first check lvalue, and
3374 we only check rvalue if it's not an assignment to NULL() or a
3375 NULLIFY statement. */
3377 bool
3378 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
3380 symbol_attribute attr, lhs_attr;
3381 gfc_ref *ref;
3382 bool is_pure, is_implicit_pure, rank_remap;
3383 int proc_pointer;
3385 lhs_attr = gfc_expr_attr (lvalue);
3386 if (lvalue->ts.type == BT_UNKNOWN && !lhs_attr.proc_pointer)
3388 gfc_error ("Pointer assignment target is not a POINTER at %L",
3389 &lvalue->where);
3390 return false;
3393 if (lhs_attr.flavor == FL_PROCEDURE && lhs_attr.use_assoc
3394 && !lhs_attr.proc_pointer)
3396 gfc_error ("%qs in the pointer assignment at %L cannot be an "
3397 "l-value since it is a procedure",
3398 lvalue->symtree->n.sym->name, &lvalue->where);
3399 return false;
3402 proc_pointer = lvalue->symtree->n.sym->attr.proc_pointer;
3404 rank_remap = false;
3405 for (ref = lvalue->ref; ref; ref = ref->next)
3407 if (ref->type == REF_COMPONENT)
3408 proc_pointer = ref->u.c.component->attr.proc_pointer;
3410 if (ref->type == REF_ARRAY && ref->next == NULL)
3412 int dim;
3414 if (ref->u.ar.type == AR_FULL)
3415 break;
3417 if (ref->u.ar.type != AR_SECTION)
3419 gfc_error ("Expected bounds specification for %qs at %L",
3420 lvalue->symtree->n.sym->name, &lvalue->where);
3421 return false;
3424 if (!gfc_notify_std (GFC_STD_F2003, "Bounds specification "
3425 "for %qs in pointer assignment at %L",
3426 lvalue->symtree->n.sym->name, &lvalue->where))
3427 return false;
3429 /* When bounds are given, all lbounds are necessary and either all
3430 or none of the upper bounds; no strides are allowed. If the
3431 upper bounds are present, we may do rank remapping. */
3432 for (dim = 0; dim < ref->u.ar.dimen; ++dim)
3434 if (!ref->u.ar.start[dim]
3435 || ref->u.ar.dimen_type[dim] != DIMEN_RANGE)
3437 gfc_error ("Lower bound has to be present at %L",
3438 &lvalue->where);
3439 return false;
3441 if (ref->u.ar.stride[dim])
3443 gfc_error ("Stride must not be present at %L",
3444 &lvalue->where);
3445 return false;
3448 if (dim == 0)
3449 rank_remap = (ref->u.ar.end[dim] != NULL);
3450 else
3452 if ((rank_remap && !ref->u.ar.end[dim])
3453 || (!rank_remap && ref->u.ar.end[dim]))
3455 gfc_error ("Either all or none of the upper bounds"
3456 " must be specified at %L", &lvalue->where);
3457 return false;
3464 is_pure = gfc_pure (NULL);
3465 is_implicit_pure = gfc_implicit_pure (NULL);
3467 /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
3468 kind, etc for lvalue and rvalue must match, and rvalue must be a
3469 pure variable if we're in a pure function. */
3470 if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
3471 return true;
3473 /* F2008, C723 (pointer) and C726 (proc-pointer); for PURE also C1283. */
3474 if (lvalue->expr_type == EXPR_VARIABLE
3475 && gfc_is_coindexed (lvalue))
3477 gfc_ref *ref;
3478 for (ref = lvalue->ref; ref; ref = ref->next)
3479 if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3481 gfc_error ("Pointer object at %L shall not have a coindex",
3482 &lvalue->where);
3483 return false;
3487 /* Checks on rvalue for procedure pointer assignments. */
3488 if (proc_pointer)
3490 char err[200];
3491 gfc_symbol *s1,*s2;
3492 gfc_component *comp1, *comp2;
3493 const char *name;
3495 attr = gfc_expr_attr (rvalue);
3496 if (!((rvalue->expr_type == EXPR_NULL)
3497 || (rvalue->expr_type == EXPR_FUNCTION && attr.proc_pointer)
3498 || (rvalue->expr_type == EXPR_VARIABLE && attr.proc_pointer)
3499 || (rvalue->expr_type == EXPR_VARIABLE
3500 && attr.flavor == FL_PROCEDURE)))
3502 gfc_error ("Invalid procedure pointer assignment at %L",
3503 &rvalue->where);
3504 return false;
3506 if (rvalue->expr_type == EXPR_VARIABLE && !attr.proc_pointer)
3508 /* Check for intrinsics. */
3509 gfc_symbol *sym = rvalue->symtree->n.sym;
3510 if (!sym->attr.intrinsic
3511 && (gfc_is_intrinsic (sym, 0, sym->declared_at)
3512 || gfc_is_intrinsic (sym, 1, sym->declared_at)))
3514 sym->attr.intrinsic = 1;
3515 gfc_resolve_intrinsic (sym, &rvalue->where);
3516 attr = gfc_expr_attr (rvalue);
3518 /* Check for result of embracing function. */
3519 if (sym->attr.function && sym->result == sym)
3521 gfc_namespace *ns;
3523 for (ns = gfc_current_ns; ns; ns = ns->parent)
3524 if (sym == ns->proc_name)
3526 gfc_error ("Function result %qs is invalid as proc-target "
3527 "in procedure pointer assignment at %L",
3528 sym->name, &rvalue->where);
3529 return false;
3533 if (attr.abstract)
3535 gfc_error ("Abstract interface %qs is invalid "
3536 "in procedure pointer assignment at %L",
3537 rvalue->symtree->name, &rvalue->where);
3538 return false;
3540 /* Check for F08:C729. */
3541 if (attr.flavor == FL_PROCEDURE)
3543 if (attr.proc == PROC_ST_FUNCTION)
3545 gfc_error ("Statement function %qs is invalid "
3546 "in procedure pointer assignment at %L",
3547 rvalue->symtree->name, &rvalue->where);
3548 return false;
3550 if (attr.proc == PROC_INTERNAL &&
3551 !gfc_notify_std(GFC_STD_F2008, "Internal procedure %qs "
3552 "is invalid in procedure pointer assignment "
3553 "at %L", rvalue->symtree->name, &rvalue->where))
3554 return false;
3555 if (attr.intrinsic && gfc_intrinsic_actual_ok (rvalue->symtree->name,
3556 attr.subroutine) == 0)
3558 gfc_error ("Intrinsic %qs at %L is invalid in procedure pointer "
3559 "assignment", rvalue->symtree->name, &rvalue->where);
3560 return false;
3563 /* Check for F08:C730. */
3564 if (attr.elemental && !attr.intrinsic)
3566 gfc_error ("Nonintrinsic elemental procedure %qs is invalid "
3567 "in procedure pointer assignment at %L",
3568 rvalue->symtree->name, &rvalue->where);
3569 return false;
3572 /* Ensure that the calling convention is the same. As other attributes
3573 such as DLLEXPORT may differ, one explicitly only tests for the
3574 calling conventions. */
3575 if (rvalue->expr_type == EXPR_VARIABLE
3576 && lvalue->symtree->n.sym->attr.ext_attr
3577 != rvalue->symtree->n.sym->attr.ext_attr)
3579 symbol_attribute calls;
3581 calls.ext_attr = 0;
3582 gfc_add_ext_attribute (&calls, EXT_ATTR_CDECL, NULL);
3583 gfc_add_ext_attribute (&calls, EXT_ATTR_STDCALL, NULL);
3584 gfc_add_ext_attribute (&calls, EXT_ATTR_FASTCALL, NULL);
3586 if ((calls.ext_attr & lvalue->symtree->n.sym->attr.ext_attr)
3587 != (calls.ext_attr & rvalue->symtree->n.sym->attr.ext_attr))
3589 gfc_error ("Mismatch in the procedure pointer assignment "
3590 "at %L: mismatch in the calling convention",
3591 &rvalue->where);
3592 return false;
3596 comp1 = gfc_get_proc_ptr_comp (lvalue);
3597 if (comp1)
3598 s1 = comp1->ts.interface;
3599 else
3601 s1 = lvalue->symtree->n.sym;
3602 if (s1->ts.interface)
3603 s1 = s1->ts.interface;
3606 comp2 = gfc_get_proc_ptr_comp (rvalue);
3607 if (comp2)
3609 if (rvalue->expr_type == EXPR_FUNCTION)
3611 s2 = comp2->ts.interface->result;
3612 name = s2->name;
3614 else
3616 s2 = comp2->ts.interface;
3617 name = comp2->name;
3620 else if (rvalue->expr_type == EXPR_FUNCTION)
3622 if (rvalue->value.function.esym)
3623 s2 = rvalue->value.function.esym->result;
3624 else
3625 s2 = rvalue->symtree->n.sym->result;
3627 name = s2->name;
3629 else
3631 s2 = rvalue->symtree->n.sym;
3632 name = s2->name;
3635 if (s2 && s2->attr.proc_pointer && s2->ts.interface)
3636 s2 = s2->ts.interface;
3638 /* Special check for the case of absent interface on the lvalue.
3639 * All other interface checks are done below. */
3640 if (!s1 && comp1 && comp1->attr.subroutine && s2 && s2->attr.function)
3642 gfc_error ("Interface mismatch in procedure pointer assignment "
3643 "at %L: %qs is not a subroutine", &rvalue->where, name);
3644 return false;
3647 /* F08:7.2.2.4 (4) */
3648 if (s2 && gfc_explicit_interface_required (s2, err, sizeof(err)))
3650 if (comp1 && !s1)
3652 gfc_error ("Explicit interface required for component %qs at %L: %s",
3653 comp1->name, &lvalue->where, err);
3654 return false;
3656 else if (s1->attr.if_source == IFSRC_UNKNOWN)
3658 gfc_error ("Explicit interface required for %qs at %L: %s",
3659 s1->name, &lvalue->where, err);
3660 return false;
3663 if (s1 && gfc_explicit_interface_required (s1, err, sizeof(err)))
3665 if (comp2 && !s2)
3667 gfc_error ("Explicit interface required for component %qs at %L: %s",
3668 comp2->name, &rvalue->where, err);
3669 return false;
3671 else if (s2->attr.if_source == IFSRC_UNKNOWN)
3673 gfc_error ("Explicit interface required for %qs at %L: %s",
3674 s2->name, &rvalue->where, err);
3675 return false;
3679 if (s1 == s2 || !s1 || !s2)
3680 return true;
3682 if (!gfc_compare_interfaces (s1, s2, name, 0, 1,
3683 err, sizeof(err), NULL, NULL))
3685 gfc_error ("Interface mismatch in procedure pointer assignment "
3686 "at %L: %s", &rvalue->where, err);
3687 return false;
3690 /* Check F2008Cor2, C729. */
3691 if (!s2->attr.intrinsic && s2->attr.if_source == IFSRC_UNKNOWN
3692 && !s2->attr.external && !s2->attr.subroutine && !s2->attr.function)
3694 gfc_error ("Procedure pointer target %qs at %L must be either an "
3695 "intrinsic, host or use associated, referenced or have "
3696 "the EXTERNAL attribute", s2->name, &rvalue->where);
3697 return false;
3700 return true;
3703 if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
3705 /* Check for F03:C717. */
3706 if (UNLIMITED_POLY (rvalue)
3707 && !(UNLIMITED_POLY (lvalue)
3708 || (lvalue->ts.type == BT_DERIVED
3709 && (lvalue->ts.u.derived->attr.is_bind_c
3710 || lvalue->ts.u.derived->attr.sequence))))
3711 gfc_error ("Data-pointer-object at %L must be unlimited "
3712 "polymorphic, or of a type with the BIND or SEQUENCE "
3713 "attribute, to be compatible with an unlimited "
3714 "polymorphic target", &lvalue->where);
3715 else
3716 gfc_error ("Different types in pointer assignment at %L; "
3717 "attempted assignment of %s to %s", &lvalue->where,
3718 gfc_typename (&rvalue->ts),
3719 gfc_typename (&lvalue->ts));
3720 return false;
3723 if (lvalue->ts.type != BT_CLASS && lvalue->ts.kind != rvalue->ts.kind)
3725 gfc_error ("Different kind type parameters in pointer "
3726 "assignment at %L", &lvalue->where);
3727 return false;
3730 if (lvalue->rank != rvalue->rank && !rank_remap)
3732 gfc_error ("Different ranks in pointer assignment at %L", &lvalue->where);
3733 return false;
3736 /* Make sure the vtab is present. */
3737 if (lvalue->ts.type == BT_CLASS && !UNLIMITED_POLY (rvalue))
3738 gfc_find_vtab (&rvalue->ts);
3740 /* Check rank remapping. */
3741 if (rank_remap)
3743 mpz_t lsize, rsize;
3745 /* If this can be determined, check that the target must be at least as
3746 large as the pointer assigned to it is. */
3747 if (gfc_array_size (lvalue, &lsize)
3748 && gfc_array_size (rvalue, &rsize)
3749 && mpz_cmp (rsize, lsize) < 0)
3751 gfc_error ("Rank remapping target is smaller than size of the"
3752 " pointer (%ld < %ld) at %L",
3753 mpz_get_si (rsize), mpz_get_si (lsize),
3754 &lvalue->where);
3755 return false;
3758 /* The target must be either rank one or it must be simply contiguous
3759 and F2008 must be allowed. */
3760 if (rvalue->rank != 1)
3762 if (!gfc_is_simply_contiguous (rvalue, true, false))
3764 gfc_error ("Rank remapping target must be rank 1 or"
3765 " simply contiguous at %L", &rvalue->where);
3766 return false;
3768 if (!gfc_notify_std (GFC_STD_F2008, "Rank remapping target is not "
3769 "rank 1 at %L", &rvalue->where))
3770 return false;
3774 /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X). */
3775 if (rvalue->expr_type == EXPR_NULL)
3776 return true;
3778 if (lvalue->ts.type == BT_CHARACTER)
3780 bool t = gfc_check_same_strlen (lvalue, rvalue, "pointer assignment");
3781 if (!t)
3782 return false;
3785 if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
3786 lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
3788 attr = gfc_expr_attr (rvalue);
3790 if (rvalue->expr_type == EXPR_FUNCTION && !attr.pointer)
3792 /* F2008, C725. For PURE also C1283. Sometimes rvalue is a function call
3793 to caf_get. Map this to the same error message as below when it is
3794 still a variable expression. */
3795 if (rvalue->value.function.isym
3796 && rvalue->value.function.isym->id == GFC_ISYM_CAF_GET)
3797 /* The test above might need to be extend when F08, Note 5.4 has to be
3798 interpreted in the way that target and pointer with the same coindex
3799 are allowed. */
3800 gfc_error ("Data target at %L shall not have a coindex",
3801 &rvalue->where);
3802 else
3803 gfc_error ("Target expression in pointer assignment "
3804 "at %L must deliver a pointer result",
3805 &rvalue->where);
3806 return false;
3809 if (!attr.target && !attr.pointer)
3811 gfc_error ("Pointer assignment target is neither TARGET "
3812 "nor POINTER at %L", &rvalue->where);
3813 return false;
3816 if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3818 gfc_error ("Bad target in pointer assignment in PURE "
3819 "procedure at %L", &rvalue->where);
3822 if (is_implicit_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3823 gfc_unset_implicit_pure (gfc_current_ns->proc_name);
3825 if (gfc_has_vector_index (rvalue))
3827 gfc_error ("Pointer assignment with vector subscript "
3828 "on rhs at %L", &rvalue->where);
3829 return false;
3832 if (attr.is_protected && attr.use_assoc
3833 && !(attr.pointer || attr.proc_pointer))
3835 gfc_error ("Pointer assignment target has PROTECTED "
3836 "attribute at %L", &rvalue->where);
3837 return false;
3840 /* F2008, C725. For PURE also C1283. */
3841 if (rvalue->expr_type == EXPR_VARIABLE
3842 && gfc_is_coindexed (rvalue))
3844 gfc_ref *ref;
3845 for (ref = rvalue->ref; ref; ref = ref->next)
3846 if (ref->type == REF_ARRAY && ref->u.ar.codimen)
3848 gfc_error ("Data target at %L shall not have a coindex",
3849 &rvalue->where);
3850 return false;
3854 /* Warn if it is the LHS pointer may lives longer than the RHS target. */
3855 if (warn_target_lifetime
3856 && rvalue->expr_type == EXPR_VARIABLE
3857 && !rvalue->symtree->n.sym->attr.save
3858 && !rvalue->symtree->n.sym->attr.pointer && !attr.pointer
3859 && !rvalue->symtree->n.sym->attr.host_assoc
3860 && !rvalue->symtree->n.sym->attr.in_common
3861 && !rvalue->symtree->n.sym->attr.use_assoc
3862 && !rvalue->symtree->n.sym->attr.dummy)
3864 bool warn;
3865 gfc_namespace *ns;
3867 warn = lvalue->symtree->n.sym->attr.dummy
3868 || lvalue->symtree->n.sym->attr.result
3869 || lvalue->symtree->n.sym->attr.function
3870 || (lvalue->symtree->n.sym->attr.host_assoc
3871 && lvalue->symtree->n.sym->ns
3872 != rvalue->symtree->n.sym->ns)
3873 || lvalue->symtree->n.sym->attr.use_assoc
3874 || lvalue->symtree->n.sym->attr.in_common;
3876 if (rvalue->symtree->n.sym->ns->proc_name
3877 && rvalue->symtree->n.sym->ns->proc_name->attr.flavor != FL_PROCEDURE
3878 && rvalue->symtree->n.sym->ns->proc_name->attr.flavor != FL_PROGRAM)
3879 for (ns = rvalue->symtree->n.sym->ns;
3880 ns && ns->proc_name && ns->proc_name->attr.flavor != FL_PROCEDURE;
3881 ns = ns->parent)
3882 if (ns->parent == lvalue->symtree->n.sym->ns)
3884 warn = true;
3885 break;
3888 if (warn)
3889 gfc_warning (OPT_Wtarget_lifetime,
3890 "Pointer at %L in pointer assignment might outlive the "
3891 "pointer target", &lvalue->where);
3894 return true;
3898 /* Relative of gfc_check_assign() except that the lvalue is a single
3899 symbol. Used for initialization assignments. */
3901 bool
3902 gfc_check_assign_symbol (gfc_symbol *sym, gfc_component *comp, gfc_expr *rvalue)
3904 gfc_expr lvalue;
3905 bool r;
3906 bool pointer, proc_pointer;
3908 memset (&lvalue, '\0', sizeof (gfc_expr));
3910 lvalue.expr_type = EXPR_VARIABLE;
3911 lvalue.ts = sym->ts;
3912 if (sym->as)
3913 lvalue.rank = sym->as->rank;
3914 lvalue.symtree = XCNEW (gfc_symtree);
3915 lvalue.symtree->n.sym = sym;
3916 lvalue.where = sym->declared_at;
3918 if (comp)
3920 lvalue.ref = gfc_get_ref ();
3921 lvalue.ref->type = REF_COMPONENT;
3922 lvalue.ref->u.c.component = comp;
3923 lvalue.ref->u.c.sym = sym;
3924 lvalue.ts = comp->ts;
3925 lvalue.rank = comp->as ? comp->as->rank : 0;
3926 lvalue.where = comp->loc;
3927 pointer = comp->ts.type == BT_CLASS && CLASS_DATA (comp)
3928 ? CLASS_DATA (comp)->attr.class_pointer : comp->attr.pointer;
3929 proc_pointer = comp->attr.proc_pointer;
3931 else
3933 pointer = sym->ts.type == BT_CLASS && CLASS_DATA (sym)
3934 ? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer;
3935 proc_pointer = sym->attr.proc_pointer;
3938 if (pointer || proc_pointer)
3939 r = gfc_check_pointer_assign (&lvalue, rvalue);
3940 else
3942 /* If a conversion function, e.g., __convert_i8_i4, was inserted
3943 into an array constructor, we should check if it can be reduced
3944 as an initialization expression. */
3945 if (rvalue->expr_type == EXPR_FUNCTION
3946 && rvalue->value.function.isym
3947 && (rvalue->value.function.isym->conversion == 1))
3948 gfc_check_init_expr (rvalue);
3950 r = gfc_check_assign (&lvalue, rvalue, 1);
3953 free (lvalue.symtree);
3954 free (lvalue.ref);
3956 if (!r)
3957 return r;
3959 if (pointer && rvalue->expr_type != EXPR_NULL)
3961 /* F08:C461. Additional checks for pointer initialization. */
3962 symbol_attribute attr;
3963 attr = gfc_expr_attr (rvalue);
3964 if (attr.allocatable)
3966 gfc_error ("Pointer initialization target at %L "
3967 "must not be ALLOCATABLE", &rvalue->where);
3968 return false;
3970 if (!attr.target || attr.pointer)
3972 gfc_error ("Pointer initialization target at %L "
3973 "must have the TARGET attribute", &rvalue->where);
3974 return false;
3977 if (!attr.save && rvalue->expr_type == EXPR_VARIABLE
3978 && rvalue->symtree->n.sym->ns->proc_name
3979 && rvalue->symtree->n.sym->ns->proc_name->attr.is_main_program)
3981 rvalue->symtree->n.sym->ns->proc_name->attr.save = SAVE_IMPLICIT;
3982 attr.save = SAVE_IMPLICIT;
3985 if (!attr.save)
3987 gfc_error ("Pointer initialization target at %L "
3988 "must have the SAVE attribute", &rvalue->where);
3989 return false;
3993 if (proc_pointer && rvalue->expr_type != EXPR_NULL)
3995 /* F08:C1220. Additional checks for procedure pointer initialization. */
3996 symbol_attribute attr = gfc_expr_attr (rvalue);
3997 if (attr.proc_pointer)
3999 gfc_error ("Procedure pointer initialization target at %L "
4000 "may not be a procedure pointer", &rvalue->where);
4001 return false;
4005 return true;
4009 /* Build an initializer for a local integer, real, complex, logical, or
4010 character variable, based on the command line flags finit-local-zero,
4011 finit-integer=, finit-real=, finit-logical=, and finit-character=. */
4013 gfc_expr *
4014 gfc_build_default_init_expr (gfc_typespec *ts, locus *where)
4016 int char_len;
4017 gfc_expr *init_expr;
4018 int i;
4020 /* Try to build an initializer expression. */
4021 init_expr = gfc_get_constant_expr (ts->type, ts->kind, where);
4023 /* We will only initialize integers, reals, complex, logicals, and
4024 characters, and only if the corresponding command-line flags
4025 were set. Otherwise, we free init_expr and return null. */
4026 switch (ts->type)
4028 case BT_INTEGER:
4029 if (gfc_option.flag_init_integer != GFC_INIT_INTEGER_OFF)
4030 mpz_set_si (init_expr->value.integer,
4031 gfc_option.flag_init_integer_value);
4032 else
4034 gfc_free_expr (init_expr);
4035 init_expr = NULL;
4037 break;
4039 case BT_REAL:
4040 switch (flag_init_real)
4042 case GFC_INIT_REAL_SNAN:
4043 init_expr->is_snan = 1;
4044 /* Fall through. */
4045 case GFC_INIT_REAL_NAN:
4046 mpfr_set_nan (init_expr->value.real);
4047 break;
4049 case GFC_INIT_REAL_INF:
4050 mpfr_set_inf (init_expr->value.real, 1);
4051 break;
4053 case GFC_INIT_REAL_NEG_INF:
4054 mpfr_set_inf (init_expr->value.real, -1);
4055 break;
4057 case GFC_INIT_REAL_ZERO:
4058 mpfr_set_ui (init_expr->value.real, 0.0, GFC_RND_MODE);
4059 break;
4061 default:
4062 gfc_free_expr (init_expr);
4063 init_expr = NULL;
4064 break;
4066 break;
4068 case BT_COMPLEX:
4069 switch (flag_init_real)
4071 case GFC_INIT_REAL_SNAN:
4072 init_expr->is_snan = 1;
4073 /* Fall through. */
4074 case GFC_INIT_REAL_NAN:
4075 mpfr_set_nan (mpc_realref (init_expr->value.complex));
4076 mpfr_set_nan (mpc_imagref (init_expr->value.complex));
4077 break;
4079 case GFC_INIT_REAL_INF:
4080 mpfr_set_inf (mpc_realref (init_expr->value.complex), 1);
4081 mpfr_set_inf (mpc_imagref (init_expr->value.complex), 1);
4082 break;
4084 case GFC_INIT_REAL_NEG_INF:
4085 mpfr_set_inf (mpc_realref (init_expr->value.complex), -1);
4086 mpfr_set_inf (mpc_imagref (init_expr->value.complex), -1);
4087 break;
4089 case GFC_INIT_REAL_ZERO:
4090 mpc_set_ui (init_expr->value.complex, 0, GFC_MPC_RND_MODE);
4091 break;
4093 default:
4094 gfc_free_expr (init_expr);
4095 init_expr = NULL;
4096 break;
4098 break;
4100 case BT_LOGICAL:
4101 if (gfc_option.flag_init_logical == GFC_INIT_LOGICAL_FALSE)
4102 init_expr->value.logical = 0;
4103 else if (gfc_option.flag_init_logical == GFC_INIT_LOGICAL_TRUE)
4104 init_expr->value.logical = 1;
4105 else
4107 gfc_free_expr (init_expr);
4108 init_expr = NULL;
4110 break;
4112 case BT_CHARACTER:
4113 /* For characters, the length must be constant in order to
4114 create a default initializer. */
4115 if (gfc_option.flag_init_character == GFC_INIT_CHARACTER_ON
4116 && ts->u.cl->length
4117 && ts->u.cl->length->expr_type == EXPR_CONSTANT)
4119 char_len = mpz_get_si (ts->u.cl->length->value.integer);
4120 init_expr->value.character.length = char_len;
4121 init_expr->value.character.string = gfc_get_wide_string (char_len+1);
4122 for (i = 0; i < char_len; i++)
4123 init_expr->value.character.string[i]
4124 = (unsigned char) gfc_option.flag_init_character_value;
4126 else
4128 gfc_free_expr (init_expr);
4129 init_expr = NULL;
4131 if (!init_expr && gfc_option.flag_init_character == GFC_INIT_CHARACTER_ON
4132 && ts->u.cl->length && flag_max_stack_var_size != 0)
4134 gfc_actual_arglist *arg;
4135 init_expr = gfc_get_expr ();
4136 init_expr->where = *where;
4137 init_expr->ts = *ts;
4138 init_expr->expr_type = EXPR_FUNCTION;
4139 init_expr->value.function.isym =
4140 gfc_intrinsic_function_by_id (GFC_ISYM_REPEAT);
4141 init_expr->value.function.name = "repeat";
4142 arg = gfc_get_actual_arglist ();
4143 arg->expr = gfc_get_character_expr (ts->kind, where, NULL, 1);
4144 arg->expr->value.character.string[0] =
4145 gfc_option.flag_init_character_value;
4146 arg->next = gfc_get_actual_arglist ();
4147 arg->next->expr = gfc_copy_expr (ts->u.cl->length);
4148 init_expr->value.function.actual = arg;
4150 break;
4152 default:
4153 gfc_free_expr (init_expr);
4154 init_expr = NULL;
4157 return init_expr;
4160 /* Apply an initialization expression to a typespec. Can be used for symbols or
4161 components. Similar to add_init_expr_to_sym in decl.c; could probably be
4162 combined with some effort. */
4164 void
4165 gfc_apply_init (gfc_typespec *ts, symbol_attribute *attr, gfc_expr *init)
4167 if (ts->type == BT_CHARACTER && !attr->pointer && init
4168 && ts->u.cl
4169 && ts->u.cl->length && ts->u.cl->length->expr_type == EXPR_CONSTANT)
4171 int len;
4173 gcc_assert (ts->u.cl && ts->u.cl->length);
4174 gcc_assert (ts->u.cl->length->expr_type == EXPR_CONSTANT);
4175 gcc_assert (ts->u.cl->length->ts.type == BT_INTEGER);
4177 len = mpz_get_si (ts->u.cl->length->value.integer);
4179 if (init->expr_type == EXPR_CONSTANT)
4180 gfc_set_constant_character_len (len, init, -1);
4181 else if (init
4182 && init->ts.u.cl
4183 && mpz_cmp (ts->u.cl->length->value.integer,
4184 init->ts.u.cl->length->value.integer))
4186 gfc_constructor *ctor;
4187 ctor = gfc_constructor_first (init->value.constructor);
4189 if (ctor)
4191 int first_len;
4192 bool has_ts = (init->ts.u.cl
4193 && init->ts.u.cl->length_from_typespec);
4195 /* Remember the length of the first element for checking
4196 that all elements *in the constructor* have the same
4197 length. This need not be the length of the LHS! */
4198 gcc_assert (ctor->expr->expr_type == EXPR_CONSTANT);
4199 gcc_assert (ctor->expr->ts.type == BT_CHARACTER);
4200 first_len = ctor->expr->value.character.length;
4202 for ( ; ctor; ctor = gfc_constructor_next (ctor))
4203 if (ctor->expr->expr_type == EXPR_CONSTANT)
4205 gfc_set_constant_character_len (len, ctor->expr,
4206 has_ts ? -1 : first_len);
4207 if (!ctor->expr->ts.u.cl)
4208 ctor->expr->ts.u.cl
4209 = gfc_new_charlen (gfc_current_ns, ts->u.cl);
4210 else
4211 ctor->expr->ts.u.cl->length
4212 = gfc_copy_expr (ts->u.cl->length);
4220 /* Check whether an expression is a structure constructor and whether it has
4221 other values than NULL. */
4223 bool
4224 is_non_empty_structure_constructor (gfc_expr * e)
4226 if (e->expr_type != EXPR_STRUCTURE)
4227 return false;
4229 gfc_constructor *cons = gfc_constructor_first (e->value.constructor);
4230 while (cons)
4232 if (!cons->expr || cons->expr->expr_type != EXPR_NULL)
4233 return true;
4234 cons = gfc_constructor_next (cons);
4236 return false;
4240 /* Check for default initializer; sym->value is not enough
4241 as it is also set for EXPR_NULL of allocatables. */
4243 bool
4244 gfc_has_default_initializer (gfc_symbol *der)
4246 gfc_component *c;
4248 gcc_assert (gfc_fl_struct (der->attr.flavor));
4249 for (c = der->components; c; c = c->next)
4250 if (gfc_bt_struct (c->ts.type))
4252 if (!c->attr.pointer && !c->attr.proc_pointer
4253 && !(c->attr.allocatable && der == c->ts.u.derived)
4254 && ((c->initializer
4255 && is_non_empty_structure_constructor (c->initializer))
4256 || gfc_has_default_initializer (c->ts.u.derived)))
4257 return true;
4258 if (c->attr.pointer && c->initializer)
4259 return true;
4261 else
4263 if (c->initializer)
4264 return true;
4267 return false;
4272 Generate an initializer expression which initializes the entirety of a union.
4273 A normal structure constructor is insufficient without undue effort, because
4274 components of maps may be oddly aligned/overlapped. (For example if a
4275 character is initialized from one map overtop a real from the other, only one
4276 byte of the real is actually initialized.) Unfortunately we don't know the
4277 size of the union right now, so we can't generate a proper initializer, but
4278 we use a NULL expr as a placeholder and do the right thing later in
4279 gfc_trans_subcomponent_assign.
4281 static gfc_expr *
4282 generate_union_initializer (gfc_component *un)
4284 if (un == NULL || un->ts.type != BT_UNION)
4285 return NULL;
4287 gfc_expr *placeholder = gfc_get_null_expr (&un->loc);
4288 placeholder->ts = un->ts;
4289 return placeholder;
4293 /* Get the user-specified initializer for a union, if any. This means the user
4294 has said to initialize component(s) of a map. For simplicity's sake we
4295 only allow the user to initialize the first map. We don't have to worry
4296 about overlapping initializers as they are released early in resolution (see
4297 resolve_fl_struct). */
4299 static gfc_expr *
4300 get_union_initializer (gfc_symbol *union_type, gfc_component **map_p)
4302 gfc_component *map;
4303 gfc_expr *init=NULL;
4305 if (!union_type || union_type->attr.flavor != FL_UNION)
4306 return NULL;
4308 for (map = union_type->components; map; map = map->next)
4310 if (gfc_has_default_initializer (map->ts.u.derived))
4312 init = gfc_default_initializer (&map->ts);
4313 if (map_p)
4314 *map_p = map;
4315 break;
4319 if (map_p && !init)
4320 *map_p = NULL;
4322 return init;
4325 /* Fetch or generate an initializer for the given component.
4326 Only generate an initializer if generate is true. */
4328 static gfc_expr *
4329 component_initializer (gfc_typespec *ts, gfc_component *c, bool generate)
4331 gfc_expr *init = NULL;
4333 /* See if we can find the initializer immediately.
4334 Some components should never get initializers. */
4335 if (c->initializer || !generate
4336 || (ts->type == BT_CLASS && !c->attr.allocatable)
4337 || c->attr.pointer
4338 || c->attr.class_pointer
4339 || c->attr.proc_pointer)
4340 return c->initializer;
4342 /* Recursively handle derived type components. */
4343 if (c->ts.type == BT_DERIVED || c->ts.type == BT_CLASS)
4344 init = gfc_generate_initializer (&c->ts, true);
4346 else if (c->ts.type == BT_UNION && c->ts.u.derived->components)
4348 gfc_component *map = NULL;
4349 gfc_constructor *ctor;
4350 gfc_expr *user_init;
4352 /* If we don't have a user initializer and we aren't generating one, this
4353 union has no initializer. */
4354 user_init = get_union_initializer (c->ts.u.derived, &map);
4355 if (!user_init && !generate)
4356 return NULL;
4358 /* Otherwise use a structure constructor. */
4359 init = gfc_get_structure_constructor_expr (c->ts.type, c->ts.kind,
4360 &c->loc);
4361 init->ts = c->ts;
4363 /* If we are to generate an initializer for the union, add a constructor
4364 which initializes the whole union first. */
4365 if (generate)
4367 ctor = gfc_constructor_get ();
4368 ctor->expr = generate_union_initializer (c);
4369 gfc_constructor_append (&init->value.constructor, ctor);
4372 /* If we found an initializer in one of our maps, apply it. Note this
4373 is applied _after_ the entire-union initializer above if any. */
4374 if (user_init)
4376 ctor = gfc_constructor_get ();
4377 ctor->expr = user_init;
4378 ctor->n.component = map;
4379 gfc_constructor_append (&init->value.constructor, ctor);
4383 /* Treat simple components like locals. */
4384 else
4386 init = gfc_build_default_init_expr (&c->ts, &c->loc);
4387 gfc_apply_init (&c->ts, &c->attr, init);
4390 return init;
4394 /* Get an expression for a default initializer of a derived type. */
4396 gfc_expr *
4397 gfc_default_initializer (gfc_typespec *ts)
4399 return gfc_generate_initializer (ts, false);
4403 /* Get or generate an expression for a default initializer of a derived type.
4404 If -finit-derived is specified, generate default initialization expressions
4405 for components that lack them when generate is set. */
4407 gfc_expr *
4408 gfc_generate_initializer (gfc_typespec *ts, bool generate)
4410 gfc_expr *init, *tmp;
4411 gfc_component *comp;
4412 generate = flag_init_derived && generate;
4414 /* See if we have a default initializer in this, but not in nested
4415 types (otherwise we could use gfc_has_default_initializer()).
4416 We don't need to check if we are going to generate them. */
4417 comp = ts->u.derived->components;
4418 if (!generate)
4420 for (; comp; comp = comp->next)
4421 if (comp->initializer || comp->attr.allocatable
4422 || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)
4423 && CLASS_DATA (comp)->attr.allocatable))
4424 break;
4427 if (!comp)
4428 return NULL;
4430 init = gfc_get_structure_constructor_expr (ts->type, ts->kind,
4431 &ts->u.derived->declared_at);
4432 init->ts = *ts;
4434 for (comp = ts->u.derived->components; comp; comp = comp->next)
4436 gfc_constructor *ctor = gfc_constructor_get();
4438 /* Fetch or generate an initializer for the component. */
4439 tmp = component_initializer (ts, comp, generate);
4440 if (tmp)
4442 /* Save the component ref for STRUCTUREs and UNIONs. */
4443 if (ts->u.derived->attr.flavor == FL_STRUCT
4444 || ts->u.derived->attr.flavor == FL_UNION)
4445 ctor->n.component = comp;
4447 /* If the initializer was not generated, we need a copy. */
4448 ctor->expr = comp->initializer ? gfc_copy_expr (tmp) : tmp;
4449 if ((comp->ts.type != tmp->ts.type
4450 || comp->ts.kind != tmp->ts.kind)
4451 && !comp->attr.pointer && !comp->attr.proc_pointer)
4453 bool val;
4454 val = gfc_convert_type_warn (ctor->expr, &comp->ts, 1, false);
4455 if (val == false)
4456 return NULL;
4460 if (comp->attr.allocatable
4461 || (comp->ts.type == BT_CLASS && CLASS_DATA (comp)->attr.allocatable))
4463 ctor->expr = gfc_get_expr ();
4464 ctor->expr->expr_type = EXPR_NULL;
4465 ctor->expr->where = init->where;
4466 ctor->expr->ts = comp->ts;
4469 gfc_constructor_append (&init->value.constructor, ctor);
4472 return init;
4476 /* Given a symbol, create an expression node with that symbol as a
4477 variable. If the symbol is array valued, setup a reference of the
4478 whole array. */
4480 gfc_expr *
4481 gfc_get_variable_expr (gfc_symtree *var)
4483 gfc_expr *e;
4485 e = gfc_get_expr ();
4486 e->expr_type = EXPR_VARIABLE;
4487 e->symtree = var;
4488 e->ts = var->n.sym->ts;
4490 if (var->n.sym->attr.flavor != FL_PROCEDURE
4491 && ((var->n.sym->as != NULL && var->n.sym->ts.type != BT_CLASS)
4492 || (var->n.sym->ts.type == BT_CLASS && CLASS_DATA (var->n.sym)
4493 && CLASS_DATA (var->n.sym)->as)))
4495 e->rank = var->n.sym->ts.type == BT_CLASS
4496 ? CLASS_DATA (var->n.sym)->as->rank : var->n.sym->as->rank;
4497 e->ref = gfc_get_ref ();
4498 e->ref->type = REF_ARRAY;
4499 e->ref->u.ar.type = AR_FULL;
4500 e->ref->u.ar.as = gfc_copy_array_spec (var->n.sym->ts.type == BT_CLASS
4501 ? CLASS_DATA (var->n.sym)->as
4502 : var->n.sym->as);
4505 return e;
4509 /* Adds a full array reference to an expression, as needed. */
4511 void
4512 gfc_add_full_array_ref (gfc_expr *e, gfc_array_spec *as)
4514 gfc_ref *ref;
4515 for (ref = e->ref; ref; ref = ref->next)
4516 if (!ref->next)
4517 break;
4518 if (ref)
4520 ref->next = gfc_get_ref ();
4521 ref = ref->next;
4523 else
4525 e->ref = gfc_get_ref ();
4526 ref = e->ref;
4528 ref->type = REF_ARRAY;
4529 ref->u.ar.type = AR_FULL;
4530 ref->u.ar.dimen = e->rank;
4531 ref->u.ar.where = e->where;
4532 ref->u.ar.as = as;
4536 gfc_expr *
4537 gfc_lval_expr_from_sym (gfc_symbol *sym)
4539 gfc_expr *lval;
4540 gfc_array_spec *as;
4541 lval = gfc_get_expr ();
4542 lval->expr_type = EXPR_VARIABLE;
4543 lval->where = sym->declared_at;
4544 lval->ts = sym->ts;
4545 lval->symtree = gfc_find_symtree (sym->ns->sym_root, sym->name);
4547 /* It will always be a full array. */
4548 as = IS_CLASS_ARRAY (sym) ? CLASS_DATA (sym)->as : sym->as;
4549 lval->rank = as ? as->rank : 0;
4550 if (lval->rank)
4551 gfc_add_full_array_ref (lval, as);
4552 return lval;
4556 /* Returns the array_spec of a full array expression. A NULL is
4557 returned otherwise. */
4558 gfc_array_spec *
4559 gfc_get_full_arrayspec_from_expr (gfc_expr *expr)
4561 gfc_array_spec *as;
4562 gfc_ref *ref;
4564 if (expr->rank == 0)
4565 return NULL;
4567 /* Follow any component references. */
4568 if (expr->expr_type == EXPR_VARIABLE
4569 || expr->expr_type == EXPR_CONSTANT)
4571 as = expr->symtree->n.sym->as;
4572 for (ref = expr->ref; ref; ref = ref->next)
4574 switch (ref->type)
4576 case REF_COMPONENT:
4577 as = ref->u.c.component->as;
4578 continue;
4580 case REF_SUBSTRING:
4581 continue;
4583 case REF_ARRAY:
4585 switch (ref->u.ar.type)
4587 case AR_ELEMENT:
4588 case AR_SECTION:
4589 case AR_UNKNOWN:
4590 as = NULL;
4591 continue;
4593 case AR_FULL:
4594 break;
4596 break;
4601 else
4602 as = NULL;
4604 return as;
4608 /* General expression traversal function. */
4610 bool
4611 gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
4612 bool (*func)(gfc_expr *, gfc_symbol *, int*),
4613 int f)
4615 gfc_array_ref ar;
4616 gfc_ref *ref;
4617 gfc_actual_arglist *args;
4618 gfc_constructor *c;
4619 int i;
4621 if (!expr)
4622 return false;
4624 if ((*func) (expr, sym, &f))
4625 return true;
4627 if (expr->ts.type == BT_CHARACTER
4628 && expr->ts.u.cl
4629 && expr->ts.u.cl->length
4630 && expr->ts.u.cl->length->expr_type != EXPR_CONSTANT
4631 && gfc_traverse_expr (expr->ts.u.cl->length, sym, func, f))
4632 return true;
4634 switch (expr->expr_type)
4636 case EXPR_PPC:
4637 case EXPR_COMPCALL:
4638 case EXPR_FUNCTION:
4639 for (args = expr->value.function.actual; args; args = args->next)
4641 if (gfc_traverse_expr (args->expr, sym, func, f))
4642 return true;
4644 break;
4646 case EXPR_VARIABLE:
4647 case EXPR_CONSTANT:
4648 case EXPR_NULL:
4649 case EXPR_SUBSTRING:
4650 break;
4652 case EXPR_STRUCTURE:
4653 case EXPR_ARRAY:
4654 for (c = gfc_constructor_first (expr->value.constructor);
4655 c; c = gfc_constructor_next (c))
4657 if (gfc_traverse_expr (c->expr, sym, func, f))
4658 return true;
4659 if (c->iterator)
4661 if (gfc_traverse_expr (c->iterator->var, sym, func, f))
4662 return true;
4663 if (gfc_traverse_expr (c->iterator->start, sym, func, f))
4664 return true;
4665 if (gfc_traverse_expr (c->iterator->end, sym, func, f))
4666 return true;
4667 if (gfc_traverse_expr (c->iterator->step, sym, func, f))
4668 return true;
4671 break;
4673 case EXPR_OP:
4674 if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
4675 return true;
4676 if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
4677 return true;
4678 break;
4680 default:
4681 gcc_unreachable ();
4682 break;
4685 ref = expr->ref;
4686 while (ref != NULL)
4688 switch (ref->type)
4690 case REF_ARRAY:
4691 ar = ref->u.ar;
4692 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
4694 if (gfc_traverse_expr (ar.start[i], sym, func, f))
4695 return true;
4696 if (gfc_traverse_expr (ar.end[i], sym, func, f))
4697 return true;
4698 if (gfc_traverse_expr (ar.stride[i], sym, func, f))
4699 return true;
4701 break;
4703 case REF_SUBSTRING:
4704 if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
4705 return true;
4706 if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
4707 return true;
4708 break;
4710 case REF_COMPONENT:
4711 if (ref->u.c.component->ts.type == BT_CHARACTER
4712 && ref->u.c.component->ts.u.cl
4713 && ref->u.c.component->ts.u.cl->length
4714 && ref->u.c.component->ts.u.cl->length->expr_type
4715 != EXPR_CONSTANT
4716 && gfc_traverse_expr (ref->u.c.component->ts.u.cl->length,
4717 sym, func, f))
4718 return true;
4720 if (ref->u.c.component->as)
4721 for (i = 0; i < ref->u.c.component->as->rank
4722 + ref->u.c.component->as->corank; i++)
4724 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
4725 sym, func, f))
4726 return true;
4727 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
4728 sym, func, f))
4729 return true;
4731 break;
4733 default:
4734 gcc_unreachable ();
4736 ref = ref->next;
4738 return false;
4741 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
4743 static bool
4744 expr_set_symbols_referenced (gfc_expr *expr,
4745 gfc_symbol *sym ATTRIBUTE_UNUSED,
4746 int *f ATTRIBUTE_UNUSED)
4748 if (expr->expr_type != EXPR_VARIABLE)
4749 return false;
4750 gfc_set_sym_referenced (expr->symtree->n.sym);
4751 return false;
4754 void
4755 gfc_expr_set_symbols_referenced (gfc_expr *expr)
4757 gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
4761 /* Determine if an expression is a procedure pointer component and return
4762 the component in that case. Otherwise return NULL. */
4764 gfc_component *
4765 gfc_get_proc_ptr_comp (gfc_expr *expr)
4767 gfc_ref *ref;
4769 if (!expr || !expr->ref)
4770 return NULL;
4772 ref = expr->ref;
4773 while (ref->next)
4774 ref = ref->next;
4776 if (ref->type == REF_COMPONENT
4777 && ref->u.c.component->attr.proc_pointer)
4778 return ref->u.c.component;
4780 return NULL;
4784 /* Determine if an expression is a procedure pointer component. */
4786 bool
4787 gfc_is_proc_ptr_comp (gfc_expr *expr)
4789 return (gfc_get_proc_ptr_comp (expr) != NULL);
4793 /* Determine if an expression is a function with an allocatable class scalar
4794 result. */
4795 bool
4796 gfc_is_alloc_class_scalar_function (gfc_expr *expr)
4798 if (expr->expr_type == EXPR_FUNCTION
4799 && expr->value.function.esym
4800 && expr->value.function.esym->result
4801 && expr->value.function.esym->result->ts.type == BT_CLASS
4802 && !CLASS_DATA (expr->value.function.esym->result)->attr.dimension
4803 && CLASS_DATA (expr->value.function.esym->result)->attr.allocatable)
4804 return true;
4806 return false;
4810 /* Determine if an expression is a function with an allocatable class array
4811 result. */
4812 bool
4813 gfc_is_alloc_class_array_function (gfc_expr *expr)
4815 if (expr->expr_type == EXPR_FUNCTION
4816 && expr->value.function.esym
4817 && expr->value.function.esym->result
4818 && expr->value.function.esym->result->ts.type == BT_CLASS
4819 && CLASS_DATA (expr->value.function.esym->result)->attr.dimension
4820 && CLASS_DATA (expr->value.function.esym->result)->attr.allocatable)
4821 return true;
4823 return false;
4827 /* Walk an expression tree and check each variable encountered for being typed.
4828 If strict is not set, a top-level variable is tolerated untyped in -std=gnu
4829 mode as is a basic arithmetic expression using those; this is for things in
4830 legacy-code like:
4832 INTEGER :: arr(n), n
4833 INTEGER :: arr(n + 1), n
4835 The namespace is needed for IMPLICIT typing. */
4837 static gfc_namespace* check_typed_ns;
4839 static bool
4840 expr_check_typed_help (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
4841 int* f ATTRIBUTE_UNUSED)
4843 bool t;
4845 if (e->expr_type != EXPR_VARIABLE)
4846 return false;
4848 gcc_assert (e->symtree);
4849 t = gfc_check_symbol_typed (e->symtree->n.sym, check_typed_ns,
4850 true, e->where);
4852 return (!t);
4855 bool
4856 gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
4858 bool error_found;
4860 /* If this is a top-level variable or EXPR_OP, do the check with strict given
4861 to us. */
4862 if (!strict)
4864 if (e->expr_type == EXPR_VARIABLE && !e->ref)
4865 return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
4867 if (e->expr_type == EXPR_OP)
4869 bool t = true;
4871 gcc_assert (e->value.op.op1);
4872 t = gfc_expr_check_typed (e->value.op.op1, ns, strict);
4874 if (t && e->value.op.op2)
4875 t = gfc_expr_check_typed (e->value.op.op2, ns, strict);
4877 return t;
4881 /* Otherwise, walk the expression and do it strictly. */
4882 check_typed_ns = ns;
4883 error_found = gfc_traverse_expr (e, NULL, &expr_check_typed_help, 0);
4885 return error_found ? false : true;
4889 /* This function returns true if it contains any references to PDT KIND
4890 or LEN parameters. */
4892 static bool
4893 derived_parameter_expr (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
4894 int* f ATTRIBUTE_UNUSED)
4896 if (e->expr_type != EXPR_VARIABLE)
4897 return false;
4899 gcc_assert (e->symtree);
4900 if (e->symtree->n.sym->attr.pdt_kind
4901 || e->symtree->n.sym->attr.pdt_len)
4902 return true;
4904 return false;
4908 bool
4909 gfc_derived_parameter_expr (gfc_expr *e)
4911 return gfc_traverse_expr (e, NULL, &derived_parameter_expr, 0);
4915 /* This function returns the overall type of a type parameter spec list.
4916 If all the specs are explicit, SPEC_EXPLICIT is returned. If any of the
4917 parameters are assumed/deferred then SPEC_ASSUMED/DEFERRED is returned
4918 unless derived is not NULL. In this latter case, all the LEN parameters
4919 must be either assumed or deferred for the return argument to be set to
4920 anything other than SPEC_EXPLICIT. */
4922 gfc_param_spec_type
4923 gfc_spec_list_type (gfc_actual_arglist *param_list, gfc_symbol *derived)
4925 gfc_param_spec_type res = SPEC_EXPLICIT;
4926 gfc_component *c;
4927 bool seen_assumed = false;
4928 bool seen_deferred = false;
4930 if (derived == NULL)
4932 for (; param_list; param_list = param_list->next)
4933 if (param_list->spec_type == SPEC_ASSUMED
4934 || param_list->spec_type == SPEC_DEFERRED)
4935 return param_list->spec_type;
4937 else
4939 for (; param_list; param_list = param_list->next)
4941 c = gfc_find_component (derived, param_list->name,
4942 true, true, NULL);
4943 gcc_assert (c != NULL);
4944 if (c->attr.pdt_kind)
4945 continue;
4946 else if (param_list->spec_type == SPEC_EXPLICIT)
4947 return SPEC_EXPLICIT;
4948 seen_assumed = param_list->spec_type == SPEC_ASSUMED;
4949 seen_deferred = param_list->spec_type == SPEC_DEFERRED;
4950 if (seen_assumed && seen_deferred)
4951 return SPEC_EXPLICIT;
4953 res = seen_assumed ? SPEC_ASSUMED : SPEC_DEFERRED;
4955 return res;
4959 bool
4960 gfc_ref_this_image (gfc_ref *ref)
4962 int n;
4964 gcc_assert (ref->type == REF_ARRAY && ref->u.ar.codimen > 0);
4966 for (n = ref->u.ar.dimen; n < ref->u.ar.dimen + ref->u.ar.codimen; n++)
4967 if (ref->u.ar.dimen_type[n] != DIMEN_THIS_IMAGE)
4968 return false;
4970 return true;
4973 gfc_expr *
4974 gfc_find_stat_co(gfc_expr *e)
4976 gfc_ref *ref;
4978 for (ref = e->ref; ref; ref = ref->next)
4979 if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4980 return ref->u.ar.stat;
4982 if (e->value.function.actual->expr)
4983 for (ref = e->value.function.actual->expr->ref; ref;
4984 ref = ref->next)
4985 if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4986 return ref->u.ar.stat;
4988 return NULL;
4991 bool
4992 gfc_is_coindexed (gfc_expr *e)
4994 gfc_ref *ref;
4996 for (ref = e->ref; ref; ref = ref->next)
4997 if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0)
4998 return !gfc_ref_this_image (ref);
5000 return false;
5004 /* Coarrays are variables with a corank but not being coindexed. However, also
5005 the following is a coarray: A subobject of a coarray is a coarray if it does
5006 not have any cosubscripts, vector subscripts, allocatable component
5007 selection, or pointer component selection. (F2008, 2.4.7) */
5009 bool
5010 gfc_is_coarray (gfc_expr *e)
5012 gfc_ref *ref;
5013 gfc_symbol *sym;
5014 gfc_component *comp;
5015 bool coindexed;
5016 bool coarray;
5017 int i;
5019 if (e->expr_type != EXPR_VARIABLE)
5020 return false;
5022 coindexed = false;
5023 sym = e->symtree->n.sym;
5025 if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
5026 coarray = CLASS_DATA (sym)->attr.codimension;
5027 else
5028 coarray = sym->attr.codimension;
5030 for (ref = e->ref; ref; ref = ref->next)
5031 switch (ref->type)
5033 case REF_COMPONENT:
5034 comp = ref->u.c.component;
5035 if (comp->ts.type == BT_CLASS && comp->attr.class_ok
5036 && (CLASS_DATA (comp)->attr.class_pointer
5037 || CLASS_DATA (comp)->attr.allocatable))
5039 coindexed = false;
5040 coarray = CLASS_DATA (comp)->attr.codimension;
5042 else if (comp->attr.pointer || comp->attr.allocatable)
5044 coindexed = false;
5045 coarray = comp->attr.codimension;
5047 break;
5049 case REF_ARRAY:
5050 if (!coarray)
5051 break;
5053 if (ref->u.ar.codimen > 0 && !gfc_ref_this_image (ref))
5055 coindexed = true;
5056 break;
5059 for (i = 0; i < ref->u.ar.dimen; i++)
5060 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
5062 coarray = false;
5063 break;
5065 break;
5067 case REF_SUBSTRING:
5068 break;
5071 return coarray && !coindexed;
5076 gfc_get_corank (gfc_expr *e)
5078 int corank;
5079 gfc_ref *ref;
5081 if (!gfc_is_coarray (e))
5082 return 0;
5084 if (e->ts.type == BT_CLASS && e->ts.u.derived->components)
5085 corank = e->ts.u.derived->components->as
5086 ? e->ts.u.derived->components->as->corank : 0;
5087 else
5088 corank = e->symtree->n.sym->as ? e->symtree->n.sym->as->corank : 0;
5090 for (ref = e->ref; ref; ref = ref->next)
5092 if (ref->type == REF_ARRAY)
5093 corank = ref->u.ar.as->corank;
5094 gcc_assert (ref->type != REF_SUBSTRING);
5097 return corank;
5101 /* Check whether the expression has an ultimate allocatable component.
5102 Being itself allocatable does not count. */
5103 bool
5104 gfc_has_ultimate_allocatable (gfc_expr *e)
5106 gfc_ref *ref, *last = NULL;
5108 if (e->expr_type != EXPR_VARIABLE)
5109 return false;
5111 for (ref = e->ref; ref; ref = ref->next)
5112 if (ref->type == REF_COMPONENT)
5113 last = ref;
5115 if (last && last->u.c.component->ts.type == BT_CLASS)
5116 return CLASS_DATA (last->u.c.component)->attr.alloc_comp;
5117 else if (last && last->u.c.component->ts.type == BT_DERIVED)
5118 return last->u.c.component->ts.u.derived->attr.alloc_comp;
5119 else if (last)
5120 return false;
5122 if (e->ts.type == BT_CLASS)
5123 return CLASS_DATA (e)->attr.alloc_comp;
5124 else if (e->ts.type == BT_DERIVED)
5125 return e->ts.u.derived->attr.alloc_comp;
5126 else
5127 return false;
5131 /* Check whether the expression has an pointer component.
5132 Being itself a pointer does not count. */
5133 bool
5134 gfc_has_ultimate_pointer (gfc_expr *e)
5136 gfc_ref *ref, *last = NULL;
5138 if (e->expr_type != EXPR_VARIABLE)
5139 return false;
5141 for (ref = e->ref; ref; ref = ref->next)
5142 if (ref->type == REF_COMPONENT)
5143 last = ref;
5145 if (last && last->u.c.component->ts.type == BT_CLASS)
5146 return CLASS_DATA (last->u.c.component)->attr.pointer_comp;
5147 else if (last && last->u.c.component->ts.type == BT_DERIVED)
5148 return last->u.c.component->ts.u.derived->attr.pointer_comp;
5149 else if (last)
5150 return false;
5152 if (e->ts.type == BT_CLASS)
5153 return CLASS_DATA (e)->attr.pointer_comp;
5154 else if (e->ts.type == BT_DERIVED)
5155 return e->ts.u.derived->attr.pointer_comp;
5156 else
5157 return false;
5161 /* Check whether an expression is "simply contiguous", cf. F2008, 6.5.4.
5162 Note: A scalar is not regarded as "simply contiguous" by the standard.
5163 if bool is not strict, some further checks are done - for instance,
5164 a "(::1)" is accepted. */
5166 bool
5167 gfc_is_simply_contiguous (gfc_expr *expr, bool strict, bool permit_element)
5169 bool colon;
5170 int i;
5171 gfc_array_ref *ar = NULL;
5172 gfc_ref *ref, *part_ref = NULL;
5173 gfc_symbol *sym;
5175 if (expr->expr_type == EXPR_FUNCTION)
5176 return expr->value.function.esym
5177 ? expr->value.function.esym->result->attr.contiguous : false;
5178 else if (expr->expr_type != EXPR_VARIABLE)
5179 return false;
5181 if (!permit_element && expr->rank == 0)
5182 return false;
5184 for (ref = expr->ref; ref; ref = ref->next)
5186 if (ar)
5187 return false; /* Array shall be last part-ref. */
5189 if (ref->type == REF_COMPONENT)
5190 part_ref = ref;
5191 else if (ref->type == REF_SUBSTRING)
5192 return false;
5193 else if (ref->u.ar.type != AR_ELEMENT)
5194 ar = &ref->u.ar;
5197 sym = expr->symtree->n.sym;
5198 if (expr->ts.type != BT_CLASS
5199 && ((part_ref
5200 && !part_ref->u.c.component->attr.contiguous
5201 && part_ref->u.c.component->attr.pointer)
5202 || (!part_ref
5203 && !sym->attr.contiguous
5204 && (sym->attr.pointer
5205 || sym->as->type == AS_ASSUMED_RANK
5206 || sym->as->type == AS_ASSUMED_SHAPE))))
5207 return false;
5209 if (!ar || ar->type == AR_FULL)
5210 return true;
5212 gcc_assert (ar->type == AR_SECTION);
5214 /* Check for simply contiguous array */
5215 colon = true;
5216 for (i = 0; i < ar->dimen; i++)
5218 if (ar->dimen_type[i] == DIMEN_VECTOR)
5219 return false;
5221 if (ar->dimen_type[i] == DIMEN_ELEMENT)
5223 colon = false;
5224 continue;
5227 gcc_assert (ar->dimen_type[i] == DIMEN_RANGE);
5230 /* If the previous section was not contiguous, that's an error,
5231 unless we have effective only one element and checking is not
5232 strict. */
5233 if (!colon && (strict || !ar->start[i] || !ar->end[i]
5234 || ar->start[i]->expr_type != EXPR_CONSTANT
5235 || ar->end[i]->expr_type != EXPR_CONSTANT
5236 || mpz_cmp (ar->start[i]->value.integer,
5237 ar->end[i]->value.integer) != 0))
5238 return false;
5240 /* Following the standard, "(::1)" or - if known at compile time -
5241 "(lbound:ubound)" are not simply contiguous; if strict
5242 is false, they are regarded as simply contiguous. */
5243 if (ar->stride[i] && (strict || ar->stride[i]->expr_type != EXPR_CONSTANT
5244 || ar->stride[i]->ts.type != BT_INTEGER
5245 || mpz_cmp_si (ar->stride[i]->value.integer, 1) != 0))
5246 return false;
5248 if (ar->start[i]
5249 && (strict || ar->start[i]->expr_type != EXPR_CONSTANT
5250 || !ar->as->lower[i]
5251 || ar->as->lower[i]->expr_type != EXPR_CONSTANT
5252 || mpz_cmp (ar->start[i]->value.integer,
5253 ar->as->lower[i]->value.integer) != 0))
5254 colon = false;
5256 if (ar->end[i]
5257 && (strict || ar->end[i]->expr_type != EXPR_CONSTANT
5258 || !ar->as->upper[i]
5259 || ar->as->upper[i]->expr_type != EXPR_CONSTANT
5260 || mpz_cmp (ar->end[i]->value.integer,
5261 ar->as->upper[i]->value.integer) != 0))
5262 colon = false;
5265 return true;
5269 /* Build call to an intrinsic procedure. The number of arguments has to be
5270 passed (rather than ending the list with a NULL value) because we may
5271 want to add arguments but with a NULL-expression. */
5273 gfc_expr*
5274 gfc_build_intrinsic_call (gfc_namespace *ns, gfc_isym_id id, const char* name,
5275 locus where, unsigned numarg, ...)
5277 gfc_expr* result;
5278 gfc_actual_arglist* atail;
5279 gfc_intrinsic_sym* isym;
5280 va_list ap;
5281 unsigned i;
5282 const char *mangled_name = gfc_get_string (GFC_PREFIX ("%s"), name);
5284 isym = gfc_intrinsic_function_by_id (id);
5285 gcc_assert (isym);
5287 result = gfc_get_expr ();
5288 result->expr_type = EXPR_FUNCTION;
5289 result->ts = isym->ts;
5290 result->where = where;
5291 result->value.function.name = mangled_name;
5292 result->value.function.isym = isym;
5294 gfc_get_sym_tree (mangled_name, ns, &result->symtree, false);
5295 gfc_commit_symbol (result->symtree->n.sym);
5296 gcc_assert (result->symtree
5297 && (result->symtree->n.sym->attr.flavor == FL_PROCEDURE
5298 || result->symtree->n.sym->attr.flavor == FL_UNKNOWN));
5299 result->symtree->n.sym->intmod_sym_id = id;
5300 result->symtree->n.sym->attr.flavor = FL_PROCEDURE;
5301 result->symtree->n.sym->attr.intrinsic = 1;
5302 result->symtree->n.sym->attr.artificial = 1;
5304 va_start (ap, numarg);
5305 atail = NULL;
5306 for (i = 0; i < numarg; ++i)
5308 if (atail)
5310 atail->next = gfc_get_actual_arglist ();
5311 atail = atail->next;
5313 else
5314 atail = result->value.function.actual = gfc_get_actual_arglist ();
5316 atail->expr = va_arg (ap, gfc_expr*);
5318 va_end (ap);
5320 return result;
5324 /* Check if an expression may appear in a variable definition context
5325 (F2008, 16.6.7) or pointer association context (F2008, 16.6.8).
5326 This is called from the various places when resolving
5327 the pieces that make up such a context.
5328 If own_scope is true (applies to, e.g., ac-implied-do/data-implied-do
5329 variables), some checks are not performed.
5331 Optionally, a possible error message can be suppressed if context is NULL
5332 and just the return status (true / false) be requested. */
5334 bool
5335 gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj,
5336 bool own_scope, const char* context)
5338 gfc_symbol* sym = NULL;
5339 bool is_pointer;
5340 bool check_intentin;
5341 bool ptr_component;
5342 symbol_attribute attr;
5343 gfc_ref* ref;
5344 int i;
5346 if (e->expr_type == EXPR_VARIABLE)
5348 gcc_assert (e->symtree);
5349 sym = e->symtree->n.sym;
5351 else if (e->expr_type == EXPR_FUNCTION)
5353 gcc_assert (e->symtree);
5354 sym = e->value.function.esym ? e->value.function.esym : e->symtree->n.sym;
5357 attr = gfc_expr_attr (e);
5358 if (!pointer && e->expr_type == EXPR_FUNCTION && attr.pointer)
5360 if (!(gfc_option.allow_std & GFC_STD_F2008))
5362 if (context)
5363 gfc_error ("Fortran 2008: Pointer functions in variable definition"
5364 " context (%s) at %L", context, &e->where);
5365 return false;
5368 else if (e->expr_type != EXPR_VARIABLE)
5370 if (context)
5371 gfc_error ("Non-variable expression in variable definition context (%s)"
5372 " at %L", context, &e->where);
5373 return false;
5376 if (!pointer && sym->attr.flavor == FL_PARAMETER)
5378 if (context)
5379 gfc_error ("Named constant %qs in variable definition context (%s)"
5380 " at %L", sym->name, context, &e->where);
5381 return false;
5383 if (!pointer && sym->attr.flavor != FL_VARIABLE
5384 && !(sym->attr.flavor == FL_PROCEDURE && sym == sym->result)
5385 && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer))
5387 if (context)
5388 gfc_error ("%qs in variable definition context (%s) at %L is not"
5389 " a variable", sym->name, context, &e->where);
5390 return false;
5393 /* Find out whether the expr is a pointer; this also means following
5394 component references to the last one. */
5395 is_pointer = (attr.pointer || attr.proc_pointer);
5396 if (pointer && !is_pointer)
5398 if (context)
5399 gfc_error ("Non-POINTER in pointer association context (%s)"
5400 " at %L", context, &e->where);
5401 return false;
5404 if (e->ts.type == BT_DERIVED
5405 && e->ts.u.derived == NULL)
5407 if (context)
5408 gfc_error ("Type inaccessible in variable definition context (%s) "
5409 "at %L", context, &e->where);
5410 return false;
5413 /* F2008, C1303. */
5414 if (!alloc_obj
5415 && (attr.lock_comp
5416 || (e->ts.type == BT_DERIVED
5417 && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
5418 && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_LOCK_TYPE)))
5420 if (context)
5421 gfc_error ("LOCK_TYPE in variable definition context (%s) at %L",
5422 context, &e->where);
5423 return false;
5426 /* TS18508, C702/C203. */
5427 if (!alloc_obj
5428 && (attr.lock_comp
5429 || (e->ts.type == BT_DERIVED
5430 && e->ts.u.derived->from_intmod == INTMOD_ISO_FORTRAN_ENV
5431 && e->ts.u.derived->intmod_sym_id == ISOFORTRAN_EVENT_TYPE)))
5433 if (context)
5434 gfc_error ("LOCK_EVENT in variable definition context (%s) at %L",
5435 context, &e->where);
5436 return false;
5439 /* INTENT(IN) dummy argument. Check this, unless the object itself is the
5440 component of sub-component of a pointer; we need to distinguish
5441 assignment to a pointer component from pointer-assignment to a pointer
5442 component. Note that (normal) assignment to procedure pointers is not
5443 possible. */
5444 check_intentin = !own_scope;
5445 ptr_component = (sym->ts.type == BT_CLASS && sym->ts.u.derived
5446 && CLASS_DATA (sym))
5447 ? CLASS_DATA (sym)->attr.class_pointer : sym->attr.pointer;
5448 for (ref = e->ref; ref && check_intentin; ref = ref->next)
5450 if (ptr_component && ref->type == REF_COMPONENT)
5451 check_intentin = false;
5452 if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
5454 ptr_component = true;
5455 if (!pointer)
5456 check_intentin = false;
5459 if (check_intentin && sym->attr.intent == INTENT_IN)
5461 if (pointer && is_pointer)
5463 if (context)
5464 gfc_error ("Dummy argument %qs with INTENT(IN) in pointer"
5465 " association context (%s) at %L",
5466 sym->name, context, &e->where);
5467 return false;
5469 if (!pointer && !is_pointer && !sym->attr.pointer)
5471 if (context)
5472 gfc_error ("Dummy argument %qs with INTENT(IN) in variable"
5473 " definition context (%s) at %L",
5474 sym->name, context, &e->where);
5475 return false;
5479 /* PROTECTED and use-associated. */
5480 if (sym->attr.is_protected && sym->attr.use_assoc && check_intentin)
5482 if (pointer && is_pointer)
5484 if (context)
5485 gfc_error ("Variable %qs is PROTECTED and can not appear in a"
5486 " pointer association context (%s) at %L",
5487 sym->name, context, &e->where);
5488 return false;
5490 if (!pointer && !is_pointer)
5492 if (context)
5493 gfc_error ("Variable %qs is PROTECTED and can not appear in a"
5494 " variable definition context (%s) at %L",
5495 sym->name, context, &e->where);
5496 return false;
5500 /* Variable not assignable from a PURE procedure but appears in
5501 variable definition context. */
5502 if (!pointer && !own_scope && gfc_pure (NULL) && gfc_impure_variable (sym))
5504 if (context)
5505 gfc_error ("Variable %qs can not appear in a variable definition"
5506 " context (%s) at %L in PURE procedure",
5507 sym->name, context, &e->where);
5508 return false;
5511 if (!pointer && context && gfc_implicit_pure (NULL)
5512 && gfc_impure_variable (sym))
5514 gfc_namespace *ns;
5515 gfc_symbol *sym;
5517 for (ns = gfc_current_ns; ns; ns = ns->parent)
5519 sym = ns->proc_name;
5520 if (sym == NULL)
5521 break;
5522 if (sym->attr.flavor == FL_PROCEDURE)
5524 sym->attr.implicit_pure = 0;
5525 break;
5529 /* Check variable definition context for associate-names. */
5530 if (!pointer && sym->assoc)
5532 const char* name;
5533 gfc_association_list* assoc;
5535 gcc_assert (sym->assoc->target);
5537 /* If this is a SELECT TYPE temporary (the association is used internally
5538 for SELECT TYPE), silently go over to the target. */
5539 if (sym->attr.select_type_temporary)
5541 gfc_expr* t = sym->assoc->target;
5543 gcc_assert (t->expr_type == EXPR_VARIABLE);
5544 name = t->symtree->name;
5546 if (t->symtree->n.sym->assoc)
5547 assoc = t->symtree->n.sym->assoc;
5548 else
5549 assoc = sym->assoc;
5551 else
5553 name = sym->name;
5554 assoc = sym->assoc;
5556 gcc_assert (name && assoc);
5558 /* Is association to a valid variable? */
5559 if (!assoc->variable)
5561 if (context)
5563 if (assoc->target->expr_type == EXPR_VARIABLE)
5564 gfc_error ("%qs at %L associated to vector-indexed target can"
5565 " not be used in a variable definition context (%s)",
5566 name, &e->where, context);
5567 else
5568 gfc_error ("%qs at %L associated to expression can"
5569 " not be used in a variable definition context (%s)",
5570 name, &e->where, context);
5572 return false;
5575 /* Target must be allowed to appear in a variable definition context. */
5576 if (!gfc_check_vardef_context (assoc->target, pointer, false, false, NULL))
5578 if (context)
5579 gfc_error ("Associate-name %qs can not appear in a variable"
5580 " definition context (%s) at %L because its target"
5581 " at %L can not, either",
5582 name, context, &e->where,
5583 &assoc->target->where);
5584 return false;
5588 /* Check for same value in vector expression subscript. */
5590 if (e->rank > 0)
5591 for (ref = e->ref; ref != NULL; ref = ref->next)
5592 if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
5593 for (i = 0; i < GFC_MAX_DIMENSIONS
5594 && ref->u.ar.dimen_type[i] != 0; i++)
5595 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
5597 gfc_expr *arr = ref->u.ar.start[i];
5598 if (arr->expr_type == EXPR_ARRAY)
5600 gfc_constructor *c, *n;
5601 gfc_expr *ec, *en;
5603 for (c = gfc_constructor_first (arr->value.constructor);
5604 c != NULL; c = gfc_constructor_next (c))
5606 if (c == NULL || c->iterator != NULL)
5607 continue;
5609 ec = c->expr;
5611 for (n = gfc_constructor_next (c); n != NULL;
5612 n = gfc_constructor_next (n))
5614 if (n->iterator != NULL)
5615 continue;
5617 en = n->expr;
5618 if (gfc_dep_compare_expr (ec, en) == 0)
5620 if (context)
5621 gfc_error_now ("Elements with the same value "
5622 "at %L and %L in vector "
5623 "subscript in a variable "
5624 "definition context (%s)",
5625 &(ec->where), &(en->where),
5626 context);
5627 return false;
5634 return true;