1 /* Routines for manipulation of expression nodes.
2 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
3 Free Software Foundation, Inc.
4 Contributed by Andy Vaught
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
27 #include "target-memory.h" /* for gfc_convert_boz */
29 /* Get a new expr node. */
37 gfc_clear_ts (&e->ts);
41 e->con_by_offset = NULL;
46 /* Free an argument list and everything below it. */
49 gfc_free_actual_arglist (gfc_actual_arglist *a1)
51 gfc_actual_arglist *a2;
56 gfc_free_expr (a1->expr);
63 /* Copy an arglist structure and all of the arguments. */
66 gfc_copy_actual_arglist (gfc_actual_arglist *p)
68 gfc_actual_arglist *head, *tail, *new_arg;
72 for (; p; p = p->next)
74 new_arg = gfc_get_actual_arglist ();
77 new_arg->expr = gfc_copy_expr (p->expr);
92 /* Free a list of reference structures. */
95 gfc_free_ref_list (gfc_ref *p)
107 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
109 gfc_free_expr (p->u.ar.start[i]);
110 gfc_free_expr (p->u.ar.end[i]);
111 gfc_free_expr (p->u.ar.stride[i]);
117 gfc_free_expr (p->u.ss.start);
118 gfc_free_expr (p->u.ss.end);
130 /* Workhorse function for gfc_free_expr() that frees everything
131 beneath an expression node, but not the node itself. This is
132 useful when we want to simplify a node and replace it with
133 something else or the expression node belongs to another structure. */
136 free_expr0 (gfc_expr *e)
140 switch (e->expr_type)
143 /* Free any parts of the value that need freeing. */
147 mpz_clear (e->value.integer);
151 mpfr_clear (e->value.real);
155 gfc_free (e->value.character.string);
159 mpfr_clear (e->value.complex.r);
160 mpfr_clear (e->value.complex.i);
167 /* Free the representation. */
168 if (e->representation.string)
169 gfc_free (e->representation.string);
174 if (e->value.op.op1 != NULL)
175 gfc_free_expr (e->value.op.op1);
176 if (e->value.op.op2 != NULL)
177 gfc_free_expr (e->value.op.op2);
181 gfc_free_actual_arglist (e->value.function.actual);
185 gfc_free_actual_arglist (e->value.compcall.actual);
193 gfc_free_constructor (e->value.constructor);
197 gfc_free (e->value.character.string);
204 gfc_internal_error ("free_expr0(): Bad expr type");
207 /* Free a shape array. */
208 if (e->shape != NULL)
210 for (n = 0; n < e->rank; n++)
211 mpz_clear (e->shape[n]);
216 gfc_free_ref_list (e->ref);
218 memset (e, '\0', sizeof (gfc_expr));
222 /* Free an expression node and everything beneath it. */
225 gfc_free_expr (gfc_expr *e)
229 if (e->con_by_offset)
230 splay_tree_delete (e->con_by_offset);
236 /* Graft the *src expression onto the *dest subexpression. */
239 gfc_replace_expr (gfc_expr *dest, gfc_expr *src)
247 /* Try to extract an integer constant from the passed expression node.
248 Returns an error message or NULL if the result is set. It is
249 tempting to generate an error and return SUCCESS or FAILURE, but
250 failure is OK for some callers. */
253 gfc_extract_int (gfc_expr *expr, int *result)
255 if (expr->expr_type != EXPR_CONSTANT)
256 return _("Constant expression required at %C");
258 if (expr->ts.type != BT_INTEGER)
259 return _("Integer expression required at %C");
261 if ((mpz_cmp_si (expr->value.integer, INT_MAX) > 0)
262 || (mpz_cmp_si (expr->value.integer, INT_MIN) < 0))
264 return _("Integer value too large in expression at %C");
267 *result = (int) mpz_get_si (expr->value.integer);
273 /* Recursively copy a list of reference structures. */
276 gfc_copy_ref (gfc_ref *src)
284 dest = gfc_get_ref ();
285 dest->type = src->type;
290 ar = gfc_copy_array_ref (&src->u.ar);
296 dest->u.c = src->u.c;
300 dest->u.ss = src->u.ss;
301 dest->u.ss.start = gfc_copy_expr (src->u.ss.start);
302 dest->u.ss.end = gfc_copy_expr (src->u.ss.end);
306 dest->next = gfc_copy_ref (src->next);
312 /* Detect whether an expression has any vector index array references. */
315 gfc_has_vector_index (gfc_expr *e)
319 for (ref = e->ref; ref; ref = ref->next)
320 if (ref->type == REF_ARRAY)
321 for (i = 0; i < ref->u.ar.dimen; i++)
322 if (ref->u.ar.dimen_type[i] == DIMEN_VECTOR)
328 /* Copy a shape array. */
331 gfc_copy_shape (mpz_t *shape, int rank)
339 new_shape = gfc_get_shape (rank);
341 for (n = 0; n < rank; n++)
342 mpz_init_set (new_shape[n], shape[n]);
348 /* Copy a shape array excluding dimension N, where N is an integer
349 constant expression. Dimensions are numbered in fortran style --
352 So, if the original shape array contains R elements
353 { s1 ... sN-1 sN sN+1 ... sR-1 sR}
354 the result contains R-1 elements:
355 { s1 ... sN-1 sN+1 ... sR-1}
357 If anything goes wrong -- N is not a constant, its value is out
358 of range -- or anything else, just returns NULL. */
361 gfc_copy_shape_excluding (mpz_t *shape, int rank, gfc_expr *dim)
363 mpz_t *new_shape, *s;
369 || dim->expr_type != EXPR_CONSTANT
370 || dim->ts.type != BT_INTEGER)
373 n = mpz_get_si (dim->value.integer);
374 n--; /* Convert to zero based index. */
375 if (n < 0 || n >= rank)
378 s = new_shape = gfc_get_shape (rank - 1);
380 for (i = 0; i < rank; i++)
384 mpz_init_set (*s, shape[i]);
392 /* Given an expression pointer, return a copy of the expression. This
393 subroutine is recursive. */
396 gfc_copy_expr (gfc_expr *p)
408 switch (q->expr_type)
411 s = gfc_get_wide_string (p->value.character.length + 1);
412 q->value.character.string = s;
413 memcpy (s, p->value.character.string,
414 (p->value.character.length + 1) * sizeof (gfc_char_t));
418 /* Copy target representation, if it exists. */
419 if (p->representation.string)
421 c = XCNEWVEC (char, p->representation.length + 1);
422 q->representation.string = c;
423 memcpy (c, p->representation.string, (p->representation.length + 1));
426 /* Copy the values of any pointer components of p->value. */
430 mpz_init_set (q->value.integer, p->value.integer);
434 gfc_set_model_kind (q->ts.kind);
435 mpfr_init (q->value.real);
436 mpfr_set (q->value.real, p->value.real, GFC_RND_MODE);
440 gfc_set_model_kind (q->ts.kind);
441 mpfr_init (q->value.complex.r);
442 mpfr_init (q->value.complex.i);
443 mpfr_set (q->value.complex.r, p->value.complex.r, GFC_RND_MODE);
444 mpfr_set (q->value.complex.i, p->value.complex.i, GFC_RND_MODE);
448 if (p->representation.string)
449 q->value.character.string
450 = gfc_char_to_widechar (q->representation.string);
453 s = gfc_get_wide_string (p->value.character.length + 1);
454 q->value.character.string = s;
456 /* This is the case for the C_NULL_CHAR named constant. */
457 if (p->value.character.length == 0
458 && (p->ts.is_c_interop || p->ts.is_iso_c))
461 /* Need to set the length to 1 to make sure the NUL
462 terminator is copied. */
463 q->value.character.length = 1;
466 memcpy (s, p->value.character.string,
467 (p->value.character.length + 1) * sizeof (gfc_char_t));
474 break; /* Already done. */
478 /* Should never be reached. */
480 gfc_internal_error ("gfc_copy_expr(): Bad expr node");
487 switch (q->value.op.op)
490 case INTRINSIC_PARENTHESES:
491 case INTRINSIC_UPLUS:
492 case INTRINSIC_UMINUS:
493 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
496 default: /* Binary operators. */
497 q->value.op.op1 = gfc_copy_expr (p->value.op.op1);
498 q->value.op.op2 = gfc_copy_expr (p->value.op.op2);
505 q->value.function.actual =
506 gfc_copy_actual_arglist (p->value.function.actual);
510 q->value.compcall.actual =
511 gfc_copy_actual_arglist (p->value.compcall.actual);
512 q->value.compcall.tbp = p->value.compcall.tbp;
517 q->value.constructor = gfc_copy_constructor (p->value.constructor);
525 q->shape = gfc_copy_shape (p->shape, p->rank);
527 q->ref = gfc_copy_ref (p->ref);
533 /* Return the maximum kind of two expressions. In general, higher
534 kind numbers mean more precision for numeric types. */
537 gfc_kind_max (gfc_expr *e1, gfc_expr *e2)
539 return (e1->ts.kind > e2->ts.kind) ? e1->ts.kind : e2->ts.kind;
543 /* Returns nonzero if the type is numeric, zero otherwise. */
546 numeric_type (bt type)
548 return type == BT_COMPLEX || type == BT_REAL || type == BT_INTEGER;
552 /* Returns nonzero if the typespec is a numeric type, zero otherwise. */
555 gfc_numeric_ts (gfc_typespec *ts)
557 return numeric_type (ts->type);
561 /* Returns an expression node that is an integer constant. */
570 p->expr_type = EXPR_CONSTANT;
571 p->ts.type = BT_INTEGER;
572 p->ts.kind = gfc_default_integer_kind;
574 p->where = gfc_current_locus;
575 mpz_init_set_si (p->value.integer, i);
581 /* Returns an expression node that is a logical constant. */
584 gfc_logical_expr (int i, locus *where)
590 p->expr_type = EXPR_CONSTANT;
591 p->ts.type = BT_LOGICAL;
592 p->ts.kind = gfc_default_logical_kind;
595 where = &gfc_current_locus;
597 p->value.logical = i;
603 /* Return an expression node with an optional argument list attached.
604 A variable number of gfc_expr pointers are strung together in an
605 argument list with a NULL pointer terminating the list. */
608 gfc_build_conversion (gfc_expr *e)
613 p->expr_type = EXPR_FUNCTION;
615 p->value.function.actual = NULL;
617 p->value.function.actual = gfc_get_actual_arglist ();
618 p->value.function.actual->expr = e;
624 /* Given an expression node with some sort of numeric binary
625 expression, insert type conversions required to make the operands
628 The exception is that the operands of an exponential don't have to
629 have the same type. If possible, the base is promoted to the type
630 of the exponent. For example, 1**2.3 becomes 1.0**2.3, but
631 1.0**2 stays as it is. */
634 gfc_type_convert_binary (gfc_expr *e)
638 op1 = e->value.op.op1;
639 op2 = e->value.op.op2;
641 if (op1->ts.type == BT_UNKNOWN || op2->ts.type == BT_UNKNOWN)
643 gfc_clear_ts (&e->ts);
647 /* Kind conversions of same type. */
648 if (op1->ts.type == op2->ts.type)
650 if (op1->ts.kind == op2->ts.kind)
652 /* No type conversions. */
657 if (op1->ts.kind > op2->ts.kind)
658 gfc_convert_type (op2, &op1->ts, 2);
660 gfc_convert_type (op1, &op2->ts, 2);
666 /* Integer combined with real or complex. */
667 if (op2->ts.type == BT_INTEGER)
671 /* Special case for ** operator. */
672 if (e->value.op.op == INTRINSIC_POWER)
675 gfc_convert_type (e->value.op.op2, &e->ts, 2);
679 if (op1->ts.type == BT_INTEGER)
682 gfc_convert_type (e->value.op.op1, &e->ts, 2);
686 /* Real combined with complex. */
687 e->ts.type = BT_COMPLEX;
688 if (op1->ts.kind > op2->ts.kind)
689 e->ts.kind = op1->ts.kind;
691 e->ts.kind = op2->ts.kind;
692 if (op1->ts.type != BT_COMPLEX || op1->ts.kind != e->ts.kind)
693 gfc_convert_type (e->value.op.op1, &e->ts, 2);
694 if (op2->ts.type != BT_COMPLEX || op2->ts.kind != e->ts.kind)
695 gfc_convert_type (e->value.op.op2, &e->ts, 2);
703 check_specification_function (gfc_expr *e)
710 sym = e->symtree->n.sym;
712 /* F95, 7.1.6.2; F2003, 7.1.7 */
714 && sym->attr.function
716 && !sym->attr.intrinsic
717 && !sym->attr.recursive
718 && sym->attr.proc != PROC_INTERNAL
719 && sym->attr.proc != PROC_ST_FUNCTION
720 && sym->attr.proc != PROC_UNKNOWN
721 && sym->formal == NULL)
727 /* Function to determine if an expression is constant or not. This
728 function expects that the expression has already been simplified. */
731 gfc_is_constant_expr (gfc_expr *e)
734 gfc_actual_arglist *arg;
740 switch (e->expr_type)
743 rv = (gfc_is_constant_expr (e->value.op.op1)
744 && (e->value.op.op2 == NULL
745 || gfc_is_constant_expr (e->value.op.op2)));
753 /* Specification functions are constant. */
754 if (check_specification_function (e) == MATCH_YES)
760 /* Call to intrinsic with at least one argument. */
762 if (e->value.function.isym && e->value.function.actual)
764 for (arg = e->value.function.actual; arg; arg = arg->next)
766 if (!gfc_is_constant_expr (arg->expr))
780 rv = e->ref == NULL || (gfc_is_constant_expr (e->ref->u.ss.start)
781 && gfc_is_constant_expr (e->ref->u.ss.end));
786 for (c = e->value.constructor; c; c = c->next)
787 if (!gfc_is_constant_expr (c->expr))
795 rv = gfc_constant_ac (e);
799 gfc_internal_error ("gfc_is_constant_expr(): Unknown expression type");
806 /* Is true if an array reference is followed by a component or substring
809 is_subref_array (gfc_expr * e)
814 if (e->expr_type != EXPR_VARIABLE)
817 if (e->symtree->n.sym->attr.subref_array_pointer)
821 for (ref = e->ref; ref; ref = ref->next)
823 if (ref->type == REF_ARRAY
824 && ref->u.ar.type != AR_ELEMENT)
828 && ref->type != REF_ARRAY)
835 /* Try to collapse intrinsic expressions. */
838 simplify_intrinsic_op (gfc_expr *p, int type)
841 gfc_expr *op1, *op2, *result;
843 if (p->value.op.op == INTRINSIC_USER)
846 op1 = p->value.op.op1;
847 op2 = p->value.op.op2;
850 if (gfc_simplify_expr (op1, type) == FAILURE)
852 if (gfc_simplify_expr (op2, type) == FAILURE)
855 if (!gfc_is_constant_expr (op1)
856 || (op2 != NULL && !gfc_is_constant_expr (op2)))
860 p->value.op.op1 = NULL;
861 p->value.op.op2 = NULL;
865 case INTRINSIC_PARENTHESES:
866 result = gfc_parentheses (op1);
869 case INTRINSIC_UPLUS:
870 result = gfc_uplus (op1);
873 case INTRINSIC_UMINUS:
874 result = gfc_uminus (op1);
878 result = gfc_add (op1, op2);
881 case INTRINSIC_MINUS:
882 result = gfc_subtract (op1, op2);
885 case INTRINSIC_TIMES:
886 result = gfc_multiply (op1, op2);
889 case INTRINSIC_DIVIDE:
890 result = gfc_divide (op1, op2);
893 case INTRINSIC_POWER:
894 result = gfc_power (op1, op2);
897 case INTRINSIC_CONCAT:
898 result = gfc_concat (op1, op2);
902 case INTRINSIC_EQ_OS:
903 result = gfc_eq (op1, op2, op);
907 case INTRINSIC_NE_OS:
908 result = gfc_ne (op1, op2, op);
912 case INTRINSIC_GT_OS:
913 result = gfc_gt (op1, op2, op);
917 case INTRINSIC_GE_OS:
918 result = gfc_ge (op1, op2, op);
922 case INTRINSIC_LT_OS:
923 result = gfc_lt (op1, op2, op);
927 case INTRINSIC_LE_OS:
928 result = gfc_le (op1, op2, op);
932 result = gfc_not (op1);
936 result = gfc_and (op1, op2);
940 result = gfc_or (op1, op2);
944 result = gfc_eqv (op1, op2);
948 result = gfc_neqv (op1, op2);
952 gfc_internal_error ("simplify_intrinsic_op(): Bad operator");
962 result->rank = p->rank;
963 result->where = p->where;
964 gfc_replace_expr (p, result);
970 /* Subroutine to simplify constructor expressions. Mutually recursive
971 with gfc_simplify_expr(). */
974 simplify_constructor (gfc_constructor *c, int type)
978 for (; c; c = c->next)
981 && (gfc_simplify_expr (c->iterator->start, type) == FAILURE
982 || gfc_simplify_expr (c->iterator->end, type) == FAILURE
983 || gfc_simplify_expr (c->iterator->step, type) == FAILURE))
988 /* Try and simplify a copy. Replace the original if successful
989 but keep going through the constructor at all costs. Not
990 doing so can make a dog's dinner of complicated things. */
991 p = gfc_copy_expr (c->expr);
993 if (gfc_simplify_expr (p, type) == FAILURE)
999 gfc_replace_expr (c->expr, p);
1007 /* Pull a single array element out of an array constructor. */
1010 find_array_element (gfc_constructor *cons, gfc_array_ref *ar,
1011 gfc_constructor **rval)
1013 unsigned long nelemen;
1025 mpz_init_set_ui (offset, 0);
1028 mpz_init_set_ui (span, 1);
1029 for (i = 0; i < ar->dimen; i++)
1031 e = gfc_copy_expr (ar->start[i]);
1032 if (e->expr_type != EXPR_CONSTANT)
1037 /* Check the bounds. */
1038 if ((ar->as->upper[i]
1039 && ar->as->upper[i]->expr_type == EXPR_CONSTANT
1040 && mpz_cmp (e->value.integer,
1041 ar->as->upper[i]->value.integer) > 0)
1043 (ar->as->lower[i]->expr_type == EXPR_CONSTANT
1044 && mpz_cmp (e->value.integer,
1045 ar->as->lower[i]->value.integer) < 0))
1047 gfc_error ("Index in dimension %d is out of bounds "
1048 "at %L", i + 1, &ar->c_where[i]);
1054 mpz_sub (delta, e->value.integer, ar->as->lower[i]->value.integer);
1055 mpz_mul (delta, delta, span);
1056 mpz_add (offset, offset, delta);
1058 mpz_set_ui (tmp, 1);
1059 mpz_add (tmp, tmp, ar->as->upper[i]->value.integer);
1060 mpz_sub (tmp, tmp, ar->as->lower[i]->value.integer);
1061 mpz_mul (span, span, tmp);
1064 for (nelemen = mpz_get_ui (offset); nelemen > 0; nelemen--)
1090 /* Find a component of a structure constructor. */
1092 static gfc_constructor *
1093 find_component_ref (gfc_constructor *cons, gfc_ref *ref)
1095 gfc_component *comp;
1096 gfc_component *pick;
1098 comp = ref->u.c.sym->components;
1099 pick = ref->u.c.component;
1100 while (comp != pick)
1110 /* Replace an expression with the contents of a constructor, removing
1111 the subobject reference in the process. */
1114 remove_subobject_ref (gfc_expr *p, gfc_constructor *cons)
1120 e->ref = p->ref->next;
1121 p->ref->next = NULL;
1122 gfc_replace_expr (p, e);
1126 /* Pull an array section out of an array constructor. */
1129 find_array_section (gfc_expr *expr, gfc_ref *ref)
1135 long unsigned one = 1;
1137 mpz_t start[GFC_MAX_DIMENSIONS];
1138 mpz_t end[GFC_MAX_DIMENSIONS];
1139 mpz_t stride[GFC_MAX_DIMENSIONS];
1140 mpz_t delta[GFC_MAX_DIMENSIONS];
1141 mpz_t ctr[GFC_MAX_DIMENSIONS];
1147 gfc_constructor *cons;
1148 gfc_constructor *base;
1154 gfc_constructor *vecsub[GFC_MAX_DIMENSIONS], *c;
1159 base = expr->value.constructor;
1160 expr->value.constructor = NULL;
1162 rank = ref->u.ar.as->rank;
1164 if (expr->shape == NULL)
1165 expr->shape = gfc_get_shape (rank);
1167 mpz_init_set_ui (delta_mpz, one);
1168 mpz_init_set_ui (nelts, one);
1171 /* Do the initialization now, so that we can cleanup without
1172 keeping track of where we were. */
1173 for (d = 0; d < rank; d++)
1175 mpz_init (delta[d]);
1176 mpz_init (start[d]);
1179 mpz_init (stride[d]);
1183 /* Build the counters to clock through the array reference. */
1185 for (d = 0; d < rank; d++)
1187 /* Make this stretch of code easier on the eye! */
1188 begin = ref->u.ar.start[d];
1189 finish = ref->u.ar.end[d];
1190 step = ref->u.ar.stride[d];
1191 lower = ref->u.ar.as->lower[d];
1192 upper = ref->u.ar.as->upper[d];
1194 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
1198 if (begin->expr_type != EXPR_ARRAY || !gfc_is_constant_expr (begin))
1204 gcc_assert (begin->rank == 1);
1205 gcc_assert (begin->shape);
1207 vecsub[d] = begin->value.constructor;
1208 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1209 mpz_mul (nelts, nelts, begin->shape[0]);
1210 mpz_set (expr->shape[shape_i++], begin->shape[0]);
1213 for (c = vecsub[d]; c; c = c->next)
1215 if (mpz_cmp (c->expr->value.integer, upper->value.integer) > 0
1216 || mpz_cmp (c->expr->value.integer,
1217 lower->value.integer) < 0)
1219 gfc_error ("index in dimension %d is out of bounds "
1220 "at %L", d + 1, &ref->u.ar.c_where[d]);
1228 if ((begin && begin->expr_type != EXPR_CONSTANT)
1229 || (finish && finish->expr_type != EXPR_CONSTANT)
1230 || (step && step->expr_type != EXPR_CONSTANT))
1236 /* Obtain the stride. */
1238 mpz_set (stride[d], step->value.integer);
1240 mpz_set_ui (stride[d], one);
1242 if (mpz_cmp_ui (stride[d], 0) == 0)
1243 mpz_set_ui (stride[d], one);
1245 /* Obtain the start value for the index. */
1247 mpz_set (start[d], begin->value.integer);
1249 mpz_set (start[d], lower->value.integer);
1251 mpz_set (ctr[d], start[d]);
1253 /* Obtain the end value for the index. */
1255 mpz_set (end[d], finish->value.integer);
1257 mpz_set (end[d], upper->value.integer);
1259 /* Separate 'if' because elements sometimes arrive with
1261 if (ref->u.ar.dimen_type[d] == DIMEN_ELEMENT)
1262 mpz_set (end [d], begin->value.integer);
1264 /* Check the bounds. */
1265 if (mpz_cmp (ctr[d], upper->value.integer) > 0
1266 || mpz_cmp (end[d], upper->value.integer) > 0
1267 || mpz_cmp (ctr[d], lower->value.integer) < 0
1268 || mpz_cmp (end[d], lower->value.integer) < 0)
1270 gfc_error ("index in dimension %d is out of bounds "
1271 "at %L", d + 1, &ref->u.ar.c_where[d]);
1276 /* Calculate the number of elements and the shape. */
1277 mpz_set (tmp_mpz, stride[d]);
1278 mpz_add (tmp_mpz, end[d], tmp_mpz);
1279 mpz_sub (tmp_mpz, tmp_mpz, ctr[d]);
1280 mpz_div (tmp_mpz, tmp_mpz, stride[d]);
1281 mpz_mul (nelts, nelts, tmp_mpz);
1283 /* An element reference reduces the rank of the expression; don't
1284 add anything to the shape array. */
1285 if (ref->u.ar.dimen_type[d] != DIMEN_ELEMENT)
1286 mpz_set (expr->shape[shape_i++], tmp_mpz);
1289 /* Calculate the 'stride' (=delta) for conversion of the
1290 counter values into the index along the constructor. */
1291 mpz_set (delta[d], delta_mpz);
1292 mpz_sub (tmp_mpz, upper->value.integer, lower->value.integer);
1293 mpz_add_ui (tmp_mpz, tmp_mpz, one);
1294 mpz_mul (delta_mpz, delta_mpz, tmp_mpz);
1301 /* Now clock through the array reference, calculating the index in
1302 the source constructor and transferring the elements to the new
1304 for (idx = 0; idx < (int) mpz_get_si (nelts); idx++)
1306 if (ref->u.ar.offset)
1307 mpz_set (ptr, ref->u.ar.offset->value.integer);
1309 mpz_init_set_ui (ptr, 0);
1312 for (d = 0; d < rank; d++)
1314 mpz_set (tmp_mpz, ctr[d]);
1315 mpz_sub (tmp_mpz, tmp_mpz, ref->u.ar.as->lower[d]->value.integer);
1316 mpz_mul (tmp_mpz, tmp_mpz, delta[d]);
1317 mpz_add (ptr, ptr, tmp_mpz);
1319 if (!incr_ctr) continue;
1321 if (ref->u.ar.dimen_type[d] == DIMEN_VECTOR) /* Vector subscript. */
1323 gcc_assert(vecsub[d]);
1325 if (!vecsub[d]->next)
1326 vecsub[d] = ref->u.ar.start[d]->value.constructor;
1329 vecsub[d] = vecsub[d]->next;
1332 mpz_set (ctr[d], vecsub[d]->expr->value.integer);
1336 mpz_add (ctr[d], ctr[d], stride[d]);
1338 if (mpz_cmp_ui (stride[d], 0) > 0
1339 ? mpz_cmp (ctr[d], end[d]) > 0
1340 : mpz_cmp (ctr[d], end[d]) < 0)
1341 mpz_set (ctr[d], start[d]);
1347 /* There must be a better way of dealing with negative strides
1348 than resetting the index and the constructor pointer! */
1349 if (mpz_cmp (ptr, index) < 0)
1351 mpz_set_ui (index, 0);
1355 while (cons && cons->next && mpz_cmp (ptr, index) > 0)
1357 mpz_add_ui (index, index, one);
1361 gfc_append_constructor (expr, gfc_copy_expr (cons->expr));
1369 mpz_clear (delta_mpz);
1370 mpz_clear (tmp_mpz);
1372 for (d = 0; d < rank; d++)
1374 mpz_clear (delta[d]);
1375 mpz_clear (start[d]);
1378 mpz_clear (stride[d]);
1380 gfc_free_constructor (base);
1384 /* Pull a substring out of an expression. */
1387 find_substring_ref (gfc_expr *p, gfc_expr **newp)
1394 if (p->ref->u.ss.start->expr_type != EXPR_CONSTANT
1395 || p->ref->u.ss.end->expr_type != EXPR_CONSTANT)
1398 *newp = gfc_copy_expr (p);
1399 gfc_free ((*newp)->value.character.string);
1401 end = (int) mpz_get_ui (p->ref->u.ss.end->value.integer);
1402 start = (int) mpz_get_ui (p->ref->u.ss.start->value.integer);
1403 length = end - start + 1;
1405 chr = (*newp)->value.character.string = gfc_get_wide_string (length + 1);
1406 (*newp)->value.character.length = length;
1407 memcpy (chr, &p->value.character.string[start - 1],
1408 length * sizeof (gfc_char_t));
1415 /* Simplify a subobject reference of a constructor. This occurs when
1416 parameter variable values are substituted. */
1419 simplify_const_ref (gfc_expr *p)
1421 gfc_constructor *cons;
1426 switch (p->ref->type)
1429 switch (p->ref->u.ar.type)
1432 if (find_array_element (p->value.constructor, &p->ref->u.ar,
1439 remove_subobject_ref (p, cons);
1443 if (find_array_section (p, p->ref) == FAILURE)
1445 p->ref->u.ar.type = AR_FULL;
1450 if (p->ref->next != NULL
1451 && (p->ts.type == BT_CHARACTER || p->ts.type == BT_DERIVED))
1453 cons = p->value.constructor;
1454 for (; cons; cons = cons->next)
1456 cons->expr->ref = gfc_copy_ref (p->ref->next);
1457 if (simplify_const_ref (cons->expr) == FAILURE)
1461 /* If this is a CHARACTER array and we possibly took a
1462 substring out of it, update the type-spec's character
1463 length according to the first element (as all should have
1464 the same length). */
1465 if (p->ts.type == BT_CHARACTER)
1469 gcc_assert (p->ref->next);
1470 gcc_assert (!p->ref->next->next);
1471 gcc_assert (p->ref->next->type == REF_SUBSTRING);
1473 if (p->value.constructor)
1475 const gfc_expr* first = p->value.constructor->expr;
1476 gcc_assert (first->expr_type == EXPR_CONSTANT);
1477 gcc_assert (first->ts.type == BT_CHARACTER);
1478 string_len = first->value.character.length;
1485 p->ts.cl = gfc_get_charlen ();
1486 p->ts.cl->next = NULL;
1487 p->ts.cl->length = NULL;
1489 gfc_free_expr (p->ts.cl->length);
1490 p->ts.cl->length = gfc_int_expr (string_len);
1493 gfc_free_ref_list (p->ref);
1504 cons = find_component_ref (p->value.constructor, p->ref);
1505 remove_subobject_ref (p, cons);
1509 if (find_substring_ref (p, &newp) == FAILURE)
1512 gfc_replace_expr (p, newp);
1513 gfc_free_ref_list (p->ref);
1523 /* Simplify a chain of references. */
1526 simplify_ref_chain (gfc_ref *ref, int type)
1530 for (; ref; ref = ref->next)
1535 for (n = 0; n < ref->u.ar.dimen; n++)
1537 if (gfc_simplify_expr (ref->u.ar.start[n], type) == FAILURE)
1539 if (gfc_simplify_expr (ref->u.ar.end[n], type) == FAILURE)
1541 if (gfc_simplify_expr (ref->u.ar.stride[n], type) == FAILURE)
1547 if (gfc_simplify_expr (ref->u.ss.start, type) == FAILURE)
1549 if (gfc_simplify_expr (ref->u.ss.end, type) == FAILURE)
1561 /* Try to substitute the value of a parameter variable. */
1564 simplify_parameter_variable (gfc_expr *p, int type)
1569 e = gfc_copy_expr (p->symtree->n.sym->value);
1575 /* Do not copy subobject refs for constant. */
1576 if (e->expr_type != EXPR_CONSTANT && p->ref != NULL)
1577 e->ref = gfc_copy_ref (p->ref);
1578 t = gfc_simplify_expr (e, type);
1580 /* Only use the simplification if it eliminated all subobject references. */
1581 if (t == SUCCESS && !e->ref)
1582 gfc_replace_expr (p, e);
1589 /* Given an expression, simplify it by collapsing constant
1590 expressions. Most simplification takes place when the expression
1591 tree is being constructed. If an intrinsic function is simplified
1592 at some point, we get called again to collapse the result against
1595 We work by recursively simplifying expression nodes, simplifying
1596 intrinsic functions where possible, which can lead to further
1597 constant collapsing. If an operator has constant operand(s), we
1598 rip the expression apart, and rebuild it, hoping that it becomes
1601 The expression type is defined for:
1602 0 Basic expression parsing
1603 1 Simplifying array constructors -- will substitute
1605 Returns FAILURE on error, SUCCESS otherwise.
1606 NOTE: Will return SUCCESS even if the expression can not be simplified. */
1609 gfc_simplify_expr (gfc_expr *p, int type)
1611 gfc_actual_arglist *ap;
1616 switch (p->expr_type)
1623 for (ap = p->value.function.actual; ap; ap = ap->next)
1624 if (gfc_simplify_expr (ap->expr, type) == FAILURE)
1627 if (p->value.function.isym != NULL
1628 && gfc_intrinsic_func_interface (p, 1) == MATCH_ERROR)
1633 case EXPR_SUBSTRING:
1634 if (simplify_ref_chain (p->ref, type) == FAILURE)
1637 if (gfc_is_constant_expr (p))
1642 if (p->ref && p->ref->u.ss.start)
1644 gfc_extract_int (p->ref->u.ss.start, &start);
1645 start--; /* Convert from one-based to zero-based. */
1650 if (p->ref && p->ref->u.ss.end)
1651 gfc_extract_int (p->ref->u.ss.end, &end);
1653 end = p->value.character.length;
1655 s = gfc_get_wide_string (end - start + 2);
1656 memcpy (s, p->value.character.string + start,
1657 (end - start) * sizeof (gfc_char_t));
1658 s[end - start + 1] = '\0'; /* TODO: C-style string. */
1659 gfc_free (p->value.character.string);
1660 p->value.character.string = s;
1661 p->value.character.length = end - start;
1662 p->ts.cl = gfc_get_charlen ();
1663 p->ts.cl->next = gfc_current_ns->cl_list;
1664 gfc_current_ns->cl_list = p->ts.cl;
1665 p->ts.cl->length = gfc_int_expr (p->value.character.length);
1666 gfc_free_ref_list (p->ref);
1668 p->expr_type = EXPR_CONSTANT;
1673 if (simplify_intrinsic_op (p, type) == FAILURE)
1678 /* Only substitute array parameter variables if we are in an
1679 initialization expression, or we want a subsection. */
1680 if (p->symtree->n.sym->attr.flavor == FL_PARAMETER
1681 && (gfc_init_expr || p->ref
1682 || p->symtree->n.sym->value->expr_type != EXPR_ARRAY))
1684 if (simplify_parameter_variable (p, type) == FAILURE)
1691 gfc_simplify_iterator_var (p);
1694 /* Simplify subcomponent references. */
1695 if (simplify_ref_chain (p->ref, type) == FAILURE)
1700 case EXPR_STRUCTURE:
1702 if (simplify_ref_chain (p->ref, type) == FAILURE)
1705 if (simplify_constructor (p->value.constructor, type) == FAILURE)
1708 if (p->expr_type == EXPR_ARRAY && p->ref && p->ref->type == REF_ARRAY
1709 && p->ref->u.ar.type == AR_FULL)
1710 gfc_expand_constructor (p);
1712 if (simplify_const_ref (p) == FAILURE)
1726 /* Returns the type of an expression with the exception that iterator
1727 variables are automatically integers no matter what else they may
1733 if (e->expr_type == EXPR_VARIABLE && gfc_check_iter_variable (e) == SUCCESS)
1740 /* Check an intrinsic arithmetic operation to see if it is consistent
1741 with some type of expression. */
1743 static gfc_try check_init_expr (gfc_expr *);
1746 /* Scalarize an expression for an elemental intrinsic call. */
1749 scalarize_intrinsic_call (gfc_expr *e)
1751 gfc_actual_arglist *a, *b;
1752 gfc_constructor *args[5], *ctor, *new_ctor;
1753 gfc_expr *expr, *old;
1754 int n, i, rank[5], array_arg;
1756 /* Find which, if any, arguments are arrays. Assume that the old
1757 expression carries the type information and that the first arg
1758 that is an array expression carries all the shape information.*/
1760 a = e->value.function.actual;
1761 for (; a; a = a->next)
1764 if (a->expr->expr_type != EXPR_ARRAY)
1767 expr = gfc_copy_expr (a->expr);
1774 old = gfc_copy_expr (e);
1776 gfc_free_constructor (expr->value.constructor);
1777 expr->value.constructor = NULL;
1780 expr->where = old->where;
1781 expr->expr_type = EXPR_ARRAY;
1783 /* Copy the array argument constructors into an array, with nulls
1786 a = old->value.function.actual;
1787 for (; a; a = a->next)
1789 /* Check that this is OK for an initialization expression. */
1790 if (a->expr && check_init_expr (a->expr) == FAILURE)
1794 if (a->expr && a->expr->rank && a->expr->expr_type == EXPR_VARIABLE)
1796 rank[n] = a->expr->rank;
1797 ctor = a->expr->symtree->n.sym->value->value.constructor;
1798 args[n] = gfc_copy_constructor (ctor);
1800 else if (a->expr && a->expr->expr_type == EXPR_ARRAY)
1803 rank[n] = a->expr->rank;
1806 args[n] = gfc_copy_constructor (a->expr->value.constructor);
1814 /* Using the array argument as the master, step through the array
1815 calling the function for each element and advancing the array
1816 constructors together. */
1817 ctor = args[array_arg - 1];
1819 for (; ctor; ctor = ctor->next)
1821 if (expr->value.constructor == NULL)
1822 expr->value.constructor
1823 = new_ctor = gfc_get_constructor ();
1826 new_ctor->next = gfc_get_constructor ();
1827 new_ctor = new_ctor->next;
1829 new_ctor->expr = gfc_copy_expr (old);
1830 gfc_free_actual_arglist (new_ctor->expr->value.function.actual);
1832 b = old->value.function.actual;
1833 for (i = 0; i < n; i++)
1836 new_ctor->expr->value.function.actual
1837 = a = gfc_get_actual_arglist ();
1840 a->next = gfc_get_actual_arglist ();
1844 a->expr = gfc_copy_expr (args[i]->expr);
1846 a->expr = gfc_copy_expr (b->expr);
1851 /* Simplify the function calls. If the simplification fails, the
1852 error will be flagged up down-stream or the library will deal
1854 gfc_simplify_expr (new_ctor->expr, 0);
1856 for (i = 0; i < n; i++)
1858 args[i] = args[i]->next;
1860 for (i = 1; i < n; i++)
1861 if (rank[i] && ((args[i] != NULL && args[array_arg - 1] == NULL)
1862 || (args[i] == NULL && args[array_arg - 1] != NULL)))
1868 gfc_free_expr (old);
1872 gfc_error_now ("elemental function arguments at %C are not compliant");
1875 gfc_free_expr (expr);
1876 gfc_free_expr (old);
1882 check_intrinsic_op (gfc_expr *e, gfc_try (*check_function) (gfc_expr *))
1884 gfc_expr *op1 = e->value.op.op1;
1885 gfc_expr *op2 = e->value.op.op2;
1887 if ((*check_function) (op1) == FAILURE)
1890 switch (e->value.op.op)
1892 case INTRINSIC_UPLUS:
1893 case INTRINSIC_UMINUS:
1894 if (!numeric_type (et0 (op1)))
1899 case INTRINSIC_EQ_OS:
1901 case INTRINSIC_NE_OS:
1903 case INTRINSIC_GT_OS:
1905 case INTRINSIC_GE_OS:
1907 case INTRINSIC_LT_OS:
1909 case INTRINSIC_LE_OS:
1910 if ((*check_function) (op2) == FAILURE)
1913 if (!(et0 (op1) == BT_CHARACTER && et0 (op2) == BT_CHARACTER)
1914 && !(numeric_type (et0 (op1)) && numeric_type (et0 (op2))))
1916 gfc_error ("Numeric or CHARACTER operands are required in "
1917 "expression at %L", &e->where);
1922 case INTRINSIC_PLUS:
1923 case INTRINSIC_MINUS:
1924 case INTRINSIC_TIMES:
1925 case INTRINSIC_DIVIDE:
1926 case INTRINSIC_POWER:
1927 if ((*check_function) (op2) == FAILURE)
1930 if (!numeric_type (et0 (op1)) || !numeric_type (et0 (op2)))
1933 if (e->value.op.op == INTRINSIC_POWER
1934 && check_function == check_init_expr && et0 (op2) != BT_INTEGER)
1936 if (gfc_notify_std (GFC_STD_F2003,"Fortran 2003: Noninteger "
1937 "exponent in an initialization "
1938 "expression at %L", &op2->where)
1945 case INTRINSIC_CONCAT:
1946 if ((*check_function) (op2) == FAILURE)
1949 if (et0 (op1) != BT_CHARACTER || et0 (op2) != BT_CHARACTER)
1951 gfc_error ("Concatenation operator in expression at %L "
1952 "must have two CHARACTER operands", &op1->where);
1956 if (op1->ts.kind != op2->ts.kind)
1958 gfc_error ("Concat operator at %L must concatenate strings of the "
1959 "same kind", &e->where);
1966 if (et0 (op1) != BT_LOGICAL)
1968 gfc_error (".NOT. operator in expression at %L must have a LOGICAL "
1969 "operand", &op1->where);
1978 case INTRINSIC_NEQV:
1979 if ((*check_function) (op2) == FAILURE)
1982 if (et0 (op1) != BT_LOGICAL || et0 (op2) != BT_LOGICAL)
1984 gfc_error ("LOGICAL operands are required in expression at %L",
1991 case INTRINSIC_PARENTHESES:
1995 gfc_error ("Only intrinsic operators can be used in expression at %L",
2003 gfc_error ("Numeric operands are required in expression at %L", &e->where);
2010 check_init_expr_arguments (gfc_expr *e)
2012 gfc_actual_arglist *ap;
2014 for (ap = e->value.function.actual; ap; ap = ap->next)
2015 if (check_init_expr (ap->expr) == FAILURE)
2021 /* F95, 7.1.6.1, Initialization expressions, (7)
2022 F2003, 7.1.7 Initialization expression, (8) */
2025 check_inquiry (gfc_expr *e, int not_restricted)
2028 const char *const *functions;
2030 static const char *const inquiry_func_f95[] = {
2031 "lbound", "shape", "size", "ubound",
2032 "bit_size", "len", "kind",
2033 "digits", "epsilon", "huge", "maxexponent", "minexponent",
2034 "precision", "radix", "range", "tiny",
2038 static const char *const inquiry_func_f2003[] = {
2039 "lbound", "shape", "size", "ubound",
2040 "bit_size", "len", "kind",
2041 "digits", "epsilon", "huge", "maxexponent", "minexponent",
2042 "precision", "radix", "range", "tiny",
2047 gfc_actual_arglist *ap;
2049 if (!e->value.function.isym
2050 || !e->value.function.isym->inquiry)
2053 /* An undeclared parameter will get us here (PR25018). */
2054 if (e->symtree == NULL)
2057 name = e->symtree->n.sym->name;
2059 functions = (gfc_option.warn_std & GFC_STD_F2003)
2060 ? inquiry_func_f2003 : inquiry_func_f95;
2062 for (i = 0; functions[i]; i++)
2063 if (strcmp (functions[i], name) == 0)
2066 if (functions[i] == NULL)
2069 /* At this point we have an inquiry function with a variable argument. The
2070 type of the variable might be undefined, but we need it now, because the
2071 arguments of these functions are not allowed to be undefined. */
2073 for (ap = e->value.function.actual; ap; ap = ap->next)
2078 if (ap->expr->ts.type == BT_UNKNOWN)
2080 if (ap->expr->symtree->n.sym->ts.type == BT_UNKNOWN
2081 && gfc_set_default_type (ap->expr->symtree->n.sym, 0, gfc_current_ns)
2085 ap->expr->ts = ap->expr->symtree->n.sym->ts;
2088 /* Assumed character length will not reduce to a constant expression
2089 with LEN, as required by the standard. */
2090 if (i == 5 && not_restricted
2091 && ap->expr->symtree->n.sym->ts.type == BT_CHARACTER
2092 && ap->expr->symtree->n.sym->ts.cl->length == NULL)
2094 gfc_error ("Assumed character length variable '%s' in constant "
2095 "expression at %L", e->symtree->n.sym->name, &e->where);
2098 else if (not_restricted && check_init_expr (ap->expr) == FAILURE)
2106 /* F95, 7.1.6.1, Initialization expressions, (5)
2107 F2003, 7.1.7 Initialization expression, (5) */
2110 check_transformational (gfc_expr *e)
2112 static const char * const trans_func_f95[] = {
2113 "repeat", "reshape", "selected_int_kind",
2114 "selected_real_kind", "transfer", "trim", NULL
2120 if (!e->value.function.isym
2121 || !e->value.function.isym->transformational)
2124 name = e->symtree->n.sym->name;
2126 /* NULL() is dealt with below. */
2127 if (strcmp ("null", name) == 0)
2130 for (i = 0; trans_func_f95[i]; i++)
2131 if (strcmp (trans_func_f95[i], name) == 0)
2134 /* FIXME, F2003: implement translation of initialization
2135 expressions before enabling this check. For F95, error
2136 out if the transformational function is not in the list. */
2138 if (trans_func_f95[i] == NULL
2139 && gfc_notify_std (GFC_STD_F2003,
2140 "transformational intrinsic '%s' at %L is not permitted "
2141 "in an initialization expression", name, &e->where) == FAILURE)
2144 if (trans_func_f95[i] == NULL)
2146 gfc_error("transformational intrinsic '%s' at %L is not permitted "
2147 "in an initialization expression", name, &e->where);
2152 return check_init_expr_arguments (e);
2156 /* F95, 7.1.6.1, Initialization expressions, (6)
2157 F2003, 7.1.7 Initialization expression, (6) */
2160 check_null (gfc_expr *e)
2162 if (strcmp ("null", e->symtree->n.sym->name) != 0)
2165 return check_init_expr_arguments (e);
2170 check_elemental (gfc_expr *e)
2172 if (!e->value.function.isym
2173 || !e->value.function.isym->elemental)
2176 if (e->ts.type != BT_INTEGER
2177 && e->ts.type != BT_CHARACTER
2178 && gfc_notify_std (GFC_STD_F2003, "Extension: Evaluation of "
2179 "nonstandard initialization expression at %L",
2180 &e->where) == FAILURE)
2183 return check_init_expr_arguments (e);
2188 check_conversion (gfc_expr *e)
2190 if (!e->value.function.isym
2191 || !e->value.function.isym->conversion)
2194 return check_init_expr_arguments (e);
2198 /* Verify that an expression is an initialization expression. A side
2199 effect is that the expression tree is reduced to a single constant
2200 node if all goes well. This would normally happen when the
2201 expression is constructed but function references are assumed to be
2202 intrinsics in the context of initialization expressions. If
2203 FAILURE is returned an error message has been generated. */
2206 check_init_expr (gfc_expr *e)
2214 switch (e->expr_type)
2217 t = check_intrinsic_op (e, check_init_expr);
2219 t = gfc_simplify_expr (e, 0);
2226 if ((m = check_specification_function (e)) != MATCH_YES)
2228 gfc_intrinsic_sym* isym;
2231 sym = e->symtree->n.sym;
2232 if (!gfc_is_intrinsic (sym, 0, e->where)
2233 || (m = gfc_intrinsic_func_interface (e, 0)) != MATCH_YES)
2235 gfc_error ("Function '%s' in initialization expression at %L "
2236 "must be an intrinsic or a specification function",
2237 e->symtree->n.sym->name, &e->where);
2241 if ((m = check_conversion (e)) == MATCH_NO
2242 && (m = check_inquiry (e, 1)) == MATCH_NO
2243 && (m = check_null (e)) == MATCH_NO
2244 && (m = check_transformational (e)) == MATCH_NO
2245 && (m = check_elemental (e)) == MATCH_NO)
2247 gfc_error ("Intrinsic function '%s' at %L is not permitted "
2248 "in an initialization expression",
2249 e->symtree->n.sym->name, &e->where);
2253 /* Try to scalarize an elemental intrinsic function that has an
2255 isym = gfc_find_function (e->symtree->n.sym->name);
2256 if (isym && isym->elemental
2257 && (t = scalarize_intrinsic_call (e)) == SUCCESS)
2262 t = gfc_simplify_expr (e, 0);
2269 if (gfc_check_iter_variable (e) == SUCCESS)
2272 if (e->symtree->n.sym->attr.flavor == FL_PARAMETER)
2274 /* A PARAMETER shall not be used to define itself, i.e.
2275 REAL, PARAMETER :: x = transfer(0, x)
2277 if (!e->symtree->n.sym->value)
2279 gfc_error("PARAMETER '%s' is used at %L before its definition "
2280 "is complete", e->symtree->n.sym->name, &e->where);
2284 t = simplify_parameter_variable (e, 0);
2289 if (gfc_in_match_data ())
2294 if (e->symtree->n.sym->as)
2296 switch (e->symtree->n.sym->as->type)
2298 case AS_ASSUMED_SIZE:
2299 gfc_error ("Assumed size array '%s' at %L is not permitted "
2300 "in an initialization expression",
2301 e->symtree->n.sym->name, &e->where);
2304 case AS_ASSUMED_SHAPE:
2305 gfc_error ("Assumed shape array '%s' at %L is not permitted "
2306 "in an initialization expression",
2307 e->symtree->n.sym->name, &e->where);
2311 gfc_error ("Deferred array '%s' at %L is not permitted "
2312 "in an initialization expression",
2313 e->symtree->n.sym->name, &e->where);
2317 gfc_error ("Array '%s' at %L is a variable, which does "
2318 "not reduce to a constant expression",
2319 e->symtree->n.sym->name, &e->where);
2327 gfc_error ("Parameter '%s' at %L has not been declared or is "
2328 "a variable, which does not reduce to a constant "
2329 "expression", e->symtree->n.sym->name, &e->where);
2338 case EXPR_SUBSTRING:
2339 t = check_init_expr (e->ref->u.ss.start);
2343 t = check_init_expr (e->ref->u.ss.end);
2345 t = gfc_simplify_expr (e, 0);
2349 case EXPR_STRUCTURE:
2353 t = gfc_check_constructor (e, check_init_expr);
2357 t = gfc_check_constructor (e, check_init_expr);
2361 t = gfc_expand_constructor (e);
2365 t = gfc_check_constructor_type (e);
2369 gfc_internal_error ("check_init_expr(): Unknown expression type");
2376 /* Match an initialization expression. We work by first matching an
2377 expression, then reducing it to a constant. */
2380 gfc_match_init_expr (gfc_expr **result)
2386 m = gfc_match_expr (&expr);
2391 t = gfc_resolve_expr (expr);
2393 t = check_init_expr (expr);
2398 gfc_free_expr (expr);
2402 if (expr->expr_type == EXPR_ARRAY
2403 && (gfc_check_constructor_type (expr) == FAILURE
2404 || gfc_expand_constructor (expr) == FAILURE))
2406 gfc_free_expr (expr);
2410 /* Not all inquiry functions are simplified to constant expressions
2411 so it is necessary to call check_inquiry again. */
2412 if (!gfc_is_constant_expr (expr) && check_inquiry (expr, 1) != MATCH_YES
2413 && !gfc_in_match_data ())
2415 gfc_error ("Initialization expression didn't reduce %C");
2425 static gfc_try check_restricted (gfc_expr *);
2427 /* Given an actual argument list, test to see that each argument is a
2428 restricted expression and optionally if the expression type is
2429 integer or character. */
2432 restricted_args (gfc_actual_arglist *a)
2434 for (; a; a = a->next)
2436 if (check_restricted (a->expr) == FAILURE)
2444 /************* Restricted/specification expressions *************/
2447 /* Make sure a non-intrinsic function is a specification function. */
2450 external_spec_function (gfc_expr *e)
2454 f = e->value.function.esym;
2456 if (f->attr.proc == PROC_ST_FUNCTION)
2458 gfc_error ("Specification function '%s' at %L cannot be a statement "
2459 "function", f->name, &e->where);
2463 if (f->attr.proc == PROC_INTERNAL)
2465 gfc_error ("Specification function '%s' at %L cannot be an internal "
2466 "function", f->name, &e->where);
2470 if (!f->attr.pure && !f->attr.elemental)
2472 gfc_error ("Specification function '%s' at %L must be PURE", f->name,
2477 if (f->attr.recursive)
2479 gfc_error ("Specification function '%s' at %L cannot be RECURSIVE",
2480 f->name, &e->where);
2484 return restricted_args (e->value.function.actual);
2488 /* Check to see that a function reference to an intrinsic is a
2489 restricted expression. */
2492 restricted_intrinsic (gfc_expr *e)
2494 /* TODO: Check constraints on inquiry functions. 7.1.6.2 (7). */
2495 if (check_inquiry (e, 0) == MATCH_YES)
2498 return restricted_args (e->value.function.actual);
2502 /* Verify that an expression is a restricted expression. Like its
2503 cousin check_init_expr(), an error message is generated if we
2507 check_restricted (gfc_expr *e)
2515 switch (e->expr_type)
2518 t = check_intrinsic_op (e, check_restricted);
2520 t = gfc_simplify_expr (e, 0);
2525 t = e->value.function.esym ? external_spec_function (e)
2526 : restricted_intrinsic (e);
2530 sym = e->symtree->n.sym;
2533 /* If a dummy argument appears in a context that is valid for a
2534 restricted expression in an elemental procedure, it will have
2535 already been simplified away once we get here. Therefore we
2536 don't need to jump through hoops to distinguish valid from
2538 if (sym->attr.dummy && sym->ns == gfc_current_ns
2539 && sym->ns->proc_name && sym->ns->proc_name->attr.elemental)
2541 gfc_error ("Dummy argument '%s' not allowed in expression at %L",
2542 sym->name, &e->where);
2546 if (sym->attr.optional)
2548 gfc_error ("Dummy argument '%s' at %L cannot be OPTIONAL",
2549 sym->name, &e->where);
2553 if (sym->attr.intent == INTENT_OUT)
2555 gfc_error ("Dummy argument '%s' at %L cannot be INTENT(OUT)",
2556 sym->name, &e->where);
2560 /* gfc_is_formal_arg broadcasts that a formal argument list is being
2561 processed in resolve.c(resolve_formal_arglist). This is done so
2562 that host associated dummy array indices are accepted (PR23446).
2563 This mechanism also does the same for the specification expressions
2564 of array-valued functions. */
2565 if (sym->attr.in_common
2566 || sym->attr.use_assoc
2568 || sym->attr.implied_index
2569 || sym->ns != gfc_current_ns
2570 || (sym->ns->proc_name != NULL
2571 && sym->ns->proc_name->attr.flavor == FL_MODULE)
2572 || (gfc_is_formal_arg () && (sym->ns == gfc_current_ns)))
2578 gfc_error ("Variable '%s' cannot appear in the expression at %L",
2579 sym->name, &e->where);
2588 case EXPR_SUBSTRING:
2589 t = gfc_specification_expr (e->ref->u.ss.start);
2593 t = gfc_specification_expr (e->ref->u.ss.end);
2595 t = gfc_simplify_expr (e, 0);
2599 case EXPR_STRUCTURE:
2600 t = gfc_check_constructor (e, check_restricted);
2604 t = gfc_check_constructor (e, check_restricted);
2608 gfc_internal_error ("check_restricted(): Unknown expression type");
2615 /* Check to see that an expression is a specification expression. If
2616 we return FAILURE, an error has been generated. */
2619 gfc_specification_expr (gfc_expr *e)
2625 if (e->ts.type != BT_INTEGER)
2627 gfc_error ("Expression at %L must be of INTEGER type, found %s",
2628 &e->where, gfc_basic_typename (e->ts.type));
2632 if (e->expr_type == EXPR_FUNCTION
2633 && !e->value.function.isym
2634 && !e->value.function.esym
2635 && !gfc_pure (e->symtree->n.sym))
2637 gfc_error ("Function '%s' at %L must be PURE",
2638 e->symtree->n.sym->name, &e->where);
2639 /* Prevent repeat error messages. */
2640 e->symtree->n.sym->attr.pure = 1;
2646 gfc_error ("Expression at %L must be scalar", &e->where);
2650 if (gfc_simplify_expr (e, 0) == FAILURE)
2653 return check_restricted (e);
2657 /************** Expression conformance checks. *************/
2659 /* Given two expressions, make sure that the arrays are conformable. */
2662 gfc_check_conformance (const char *optype_msgid, gfc_expr *op1, gfc_expr *op2)
2664 int op1_flag, op2_flag, d;
2665 mpz_t op1_size, op2_size;
2668 if (op1->rank == 0 || op2->rank == 0)
2671 if (op1->rank != op2->rank)
2673 gfc_error ("Incompatible ranks in %s (%d and %d) at %L", _(optype_msgid),
2674 op1->rank, op2->rank, &op1->where);
2680 for (d = 0; d < op1->rank; d++)
2682 op1_flag = gfc_array_dimen_size (op1, d, &op1_size) == SUCCESS;
2683 op2_flag = gfc_array_dimen_size (op2, d, &op2_size) == SUCCESS;
2685 if (op1_flag && op2_flag && mpz_cmp (op1_size, op2_size) != 0)
2687 gfc_error ("Different shape for %s at %L on dimension %d "
2688 "(%d and %d)", _(optype_msgid), &op1->where, d + 1,
2689 (int) mpz_get_si (op1_size),
2690 (int) mpz_get_si (op2_size));
2696 mpz_clear (op1_size);
2698 mpz_clear (op2_size);
2708 /* Given an assignable expression and an arbitrary expression, make
2709 sure that the assignment can take place. */
2712 gfc_check_assign (gfc_expr *lvalue, gfc_expr *rvalue, int conform)
2718 sym = lvalue->symtree->n.sym;
2720 /* Check INTENT(IN), unless the object itself is the component or
2721 sub-component of a pointer. */
2722 has_pointer = sym->attr.pointer;
2724 for (ref = lvalue->ref; ref; ref = ref->next)
2725 if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
2731 if (!has_pointer && sym->attr.intent == INTENT_IN)
2733 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2734 sym->name, &lvalue->where);
2738 /* 12.5.2.2, Note 12.26: The result variable is very similar to any other
2739 variable local to a function subprogram. Its existence begins when
2740 execution of the function is initiated and ends when execution of the
2741 function is terminated...
2742 Therefore, the left hand side is no longer a variable, when it is: */
2743 if (sym->attr.flavor == FL_PROCEDURE && sym->attr.proc != PROC_ST_FUNCTION
2744 && !sym->attr.external)
2749 /* (i) Use associated; */
2750 if (sym->attr.use_assoc)
2753 /* (ii) The assignment is in the main program; or */
2754 if (gfc_current_ns->proc_name->attr.is_main_program)
2757 /* (iii) A module or internal procedure... */
2758 if ((gfc_current_ns->proc_name->attr.proc == PROC_INTERNAL
2759 || gfc_current_ns->proc_name->attr.proc == PROC_MODULE)
2760 && gfc_current_ns->parent
2761 && (!(gfc_current_ns->parent->proc_name->attr.function
2762 || gfc_current_ns->parent->proc_name->attr.subroutine)
2763 || gfc_current_ns->parent->proc_name->attr.is_main_program))
2765 /* ... that is not a function... */
2766 if (!gfc_current_ns->proc_name->attr.function)
2769 /* ... or is not an entry and has a different name. */
2770 if (!sym->attr.entry && sym->name != gfc_current_ns->proc_name->name)
2774 /* (iv) Host associated and not the function symbol or the
2775 parent result. This picks up sibling references, which
2776 cannot be entries. */
2777 if (!sym->attr.entry
2778 && sym->ns == gfc_current_ns->parent
2779 && sym != gfc_current_ns->proc_name
2780 && sym != gfc_current_ns->parent->proc_name->result)
2785 gfc_error ("'%s' at %L is not a VALUE", sym->name, &lvalue->where);
2790 if (rvalue->rank != 0 && lvalue->rank != rvalue->rank)
2792 gfc_error ("Incompatible ranks %d and %d in assignment at %L",
2793 lvalue->rank, rvalue->rank, &lvalue->where);
2797 if (lvalue->ts.type == BT_UNKNOWN)
2799 gfc_error ("Variable type is UNKNOWN in assignment at %L",
2804 if (rvalue->expr_type == EXPR_NULL)
2806 if (lvalue->symtree->n.sym->attr.pointer
2807 && lvalue->symtree->n.sym->attr.data)
2811 gfc_error ("NULL appears on right-hand side in assignment at %L",
2817 if (sym->attr.cray_pointee
2818 && lvalue->ref != NULL
2819 && lvalue->ref->u.ar.type == AR_FULL
2820 && lvalue->ref->u.ar.as->cp_was_assumed)
2822 gfc_error ("Vector assignment to assumed-size Cray Pointee at %L "
2823 "is illegal", &lvalue->where);
2827 /* This is possibly a typo: x = f() instead of x => f(). */
2828 if (gfc_option.warn_surprising
2829 && rvalue->expr_type == EXPR_FUNCTION
2830 && rvalue->symtree->n.sym->attr.pointer)
2831 gfc_warning ("POINTER valued function appears on right-hand side of "
2832 "assignment at %L", &rvalue->where);
2834 /* Check size of array assignments. */
2835 if (lvalue->rank != 0 && rvalue->rank != 0
2836 && gfc_check_conformance ("array assignment", lvalue, rvalue) != SUCCESS)
2839 if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER
2840 && lvalue->symtree->n.sym->attr.data
2841 && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L used to "
2842 "initialize non-integer variable '%s'",
2843 &rvalue->where, lvalue->symtree->n.sym->name)
2846 else if (rvalue->is_boz && !lvalue->symtree->n.sym->attr.data
2847 && gfc_notify_std (GFC_STD_GNU, "Extension: BOZ literal at %L outside "
2848 "a DATA statement and outside INT/REAL/DBLE/CMPLX",
2849 &rvalue->where) == FAILURE)
2852 /* Handle the case of a BOZ literal on the RHS. */
2853 if (rvalue->is_boz && lvalue->ts.type != BT_INTEGER)
2856 if (gfc_option.warn_surprising)
2857 gfc_warning ("BOZ literal at %L is bitwise transferred "
2858 "non-integer symbol '%s'", &rvalue->where,
2859 lvalue->symtree->n.sym->name);
2860 if (!gfc_convert_boz (rvalue, &lvalue->ts))
2862 if ((rc = gfc_range_check (rvalue)) != ARITH_OK)
2864 if (rc == ARITH_UNDERFLOW)
2865 gfc_error ("Arithmetic underflow of bit-wise transferred BOZ at %L"
2866 ". This check can be disabled with the option "
2867 "-fno-range-check", &rvalue->where);
2868 else if (rc == ARITH_OVERFLOW)
2869 gfc_error ("Arithmetic overflow of bit-wise transferred BOZ at %L"
2870 ". This check can be disabled with the option "
2871 "-fno-range-check", &rvalue->where);
2872 else if (rc == ARITH_NAN)
2873 gfc_error ("Arithmetic NaN of bit-wise transferred BOZ at %L"
2874 ". This check can be disabled with the option "
2875 "-fno-range-check", &rvalue->where);
2880 if (gfc_compare_types (&lvalue->ts, &rvalue->ts))
2883 /* Only DATA Statements come here. */
2886 /* Numeric can be converted to any other numeric. And Hollerith can be
2887 converted to any other type. */
2888 if ((gfc_numeric_ts (&lvalue->ts) && gfc_numeric_ts (&rvalue->ts))
2889 || rvalue->ts.type == BT_HOLLERITH)
2892 if (lvalue->ts.type == BT_LOGICAL && rvalue->ts.type == BT_LOGICAL)
2895 gfc_error ("Incompatible types in DATA statement at %L; attempted "
2896 "conversion of %s to %s", &lvalue->where,
2897 gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
2902 /* Assignment is the only case where character variables of different
2903 kind values can be converted into one another. */
2904 if (lvalue->ts.type == BT_CHARACTER && rvalue->ts.type == BT_CHARACTER)
2906 if (lvalue->ts.kind != rvalue->ts.kind)
2907 gfc_convert_chartype (rvalue, &lvalue->ts);
2912 return gfc_convert_type (rvalue, &lvalue->ts, 1);
2916 /* Check that a pointer assignment is OK. We first check lvalue, and
2917 we only check rvalue if it's not an assignment to NULL() or a
2918 NULLIFY statement. */
2921 gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue)
2923 symbol_attribute attr;
2926 int pointer, check_intent_in;
2928 if (lvalue->symtree->n.sym->ts.type == BT_UNKNOWN
2929 && !lvalue->symtree->n.sym->attr.proc_pointer)
2931 gfc_error ("Pointer assignment target is not a POINTER at %L",
2936 if (lvalue->symtree->n.sym->attr.flavor == FL_PROCEDURE
2937 && lvalue->symtree->n.sym->attr.use_assoc)
2939 gfc_error ("'%s' in the pointer assignment at %L cannot be an "
2940 "l-value since it is a procedure",
2941 lvalue->symtree->n.sym->name, &lvalue->where);
2946 /* Check INTENT(IN), unless the object itself is the component or
2947 sub-component of a pointer. */
2948 check_intent_in = 1;
2949 pointer = lvalue->symtree->n.sym->attr.pointer
2950 | lvalue->symtree->n.sym->attr.proc_pointer;
2952 for (ref = lvalue->ref; ref; ref = ref->next)
2955 check_intent_in = 0;
2957 if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
2961 if (check_intent_in && lvalue->symtree->n.sym->attr.intent == INTENT_IN)
2963 gfc_error ("Cannot assign to INTENT(IN) variable '%s' at %L",
2964 lvalue->symtree->n.sym->name, &lvalue->where);
2970 gfc_error ("Pointer assignment to non-POINTER at %L", &lvalue->where);
2974 is_pure = gfc_pure (NULL);
2976 if (is_pure && gfc_impure_variable (lvalue->symtree->n.sym)
2977 && lvalue->symtree->n.sym->value != rvalue)
2979 gfc_error ("Bad pointer object in PURE procedure at %L", &lvalue->where);
2983 /* If rvalue is a NULL() or NULLIFY, we're done. Otherwise the type,
2984 kind, etc for lvalue and rvalue must match, and rvalue must be a
2985 pure variable if we're in a pure function. */
2986 if (rvalue->expr_type == EXPR_NULL && rvalue->ts.type == BT_UNKNOWN)
2989 /* TODO checks on rvalue for a procedure pointer assignment. */
2990 if (lvalue->symtree->n.sym->attr.proc_pointer)
2993 if (!gfc_compare_types (&lvalue->ts, &rvalue->ts))
2995 gfc_error ("Different types in pointer assignment at %L; attempted "
2996 "assignment of %s to %s", &lvalue->where,
2997 gfc_typename (&rvalue->ts), gfc_typename (&lvalue->ts));
3001 if (lvalue->ts.kind != rvalue->ts.kind)
3003 gfc_error ("Different kind type parameters in pointer "
3004 "assignment at %L", &lvalue->where);
3008 if (lvalue->rank != rvalue->rank)
3010 gfc_error ("Different ranks in pointer assignment at %L",
3015 /* Now punt if we are dealing with a NULLIFY(X) or X = NULL(X). */
3016 if (rvalue->expr_type == EXPR_NULL)
3019 if (lvalue->ts.type == BT_CHARACTER
3020 && lvalue->ts.cl && rvalue->ts.cl
3021 && lvalue->ts.cl->length && rvalue->ts.cl->length
3022 && abs (gfc_dep_compare_expr (lvalue->ts.cl->length,
3023 rvalue->ts.cl->length)) == 1)
3025 gfc_error ("Different character lengths in pointer "
3026 "assignment at %L", &lvalue->where);
3030 if (rvalue->expr_type == EXPR_VARIABLE && is_subref_array (rvalue))
3031 lvalue->symtree->n.sym->attr.subref_array_pointer = 1;
3033 attr = gfc_expr_attr (rvalue);
3034 if (!attr.target && !attr.pointer)
3036 gfc_error ("Pointer assignment target is neither TARGET "
3037 "nor POINTER at %L", &rvalue->where);
3041 if (is_pure && gfc_impure_variable (rvalue->symtree->n.sym))
3043 gfc_error ("Bad target in pointer assignment in PURE "
3044 "procedure at %L", &rvalue->where);
3047 if (gfc_has_vector_index (rvalue))
3049 gfc_error ("Pointer assignment with vector subscript "
3050 "on rhs at %L", &rvalue->where);
3054 if (attr.is_protected && attr.use_assoc)
3056 gfc_error ("Pointer assignment target has PROTECTED "
3057 "attribute at %L", &rvalue->where);
3065 /* Relative of gfc_check_assign() except that the lvalue is a single
3066 symbol. Used for initialization assignments. */
3069 gfc_check_assign_symbol (gfc_symbol *sym, gfc_expr *rvalue)
3074 memset (&lvalue, '\0', sizeof (gfc_expr));
3076 lvalue.expr_type = EXPR_VARIABLE;
3077 lvalue.ts = sym->ts;
3079 lvalue.rank = sym->as->rank;
3080 lvalue.symtree = (gfc_symtree *) gfc_getmem (sizeof (gfc_symtree));
3081 lvalue.symtree->n.sym = sym;
3082 lvalue.where = sym->declared_at;
3084 if (sym->attr.pointer || sym->attr.proc_pointer)
3085 r = gfc_check_pointer_assign (&lvalue, rvalue);
3087 r = gfc_check_assign (&lvalue, rvalue, 1);
3089 gfc_free (lvalue.symtree);
3095 /* Get an expression for a default initializer. */
3098 gfc_default_initializer (gfc_typespec *ts)
3100 gfc_constructor *tail;
3104 /* See if we have a default initializer. */
3105 for (c = ts->derived->components; c; c = c->next)
3106 if (c->initializer || c->attr.allocatable)
3112 /* Build the constructor. */
3113 init = gfc_get_expr ();
3114 init->expr_type = EXPR_STRUCTURE;
3116 init->where = ts->derived->declared_at;
3119 for (c = ts->derived->components; c; c = c->next)
3122 init->value.constructor = tail = gfc_get_constructor ();
3125 tail->next = gfc_get_constructor ();
3130 tail->expr = gfc_copy_expr (c->initializer);
3132 if (c->attr.allocatable)
3134 tail->expr = gfc_get_expr ();
3135 tail->expr->expr_type = EXPR_NULL;
3136 tail->expr->ts = c->ts;
3143 /* Given a symbol, create an expression node with that symbol as a
3144 variable. If the symbol is array valued, setup a reference of the
3148 gfc_get_variable_expr (gfc_symtree *var)
3152 e = gfc_get_expr ();
3153 e->expr_type = EXPR_VARIABLE;
3155 e->ts = var->n.sym->ts;
3157 if (var->n.sym->as != NULL)
3159 e->rank = var->n.sym->as->rank;
3160 e->ref = gfc_get_ref ();
3161 e->ref->type = REF_ARRAY;
3162 e->ref->u.ar.type = AR_FULL;
3169 /* General expression traversal function. */
3172 gfc_traverse_expr (gfc_expr *expr, gfc_symbol *sym,
3173 bool (*func)(gfc_expr *, gfc_symbol *, int*),
3178 gfc_actual_arglist *args;
3185 if ((*func) (expr, sym, &f))
3188 if (expr->ts.type == BT_CHARACTER
3190 && expr->ts.cl->length
3191 && expr->ts.cl->length->expr_type != EXPR_CONSTANT
3192 && gfc_traverse_expr (expr->ts.cl->length, sym, func, f))
3195 switch (expr->expr_type)
3198 for (args = expr->value.function.actual; args; args = args->next)
3200 if (gfc_traverse_expr (args->expr, sym, func, f))
3208 case EXPR_SUBSTRING:
3211 case EXPR_STRUCTURE:
3213 for (c = expr->value.constructor; c; c = c->next)
3215 if (gfc_traverse_expr (c->expr, sym, func, f))
3219 if (gfc_traverse_expr (c->iterator->var, sym, func, f))
3221 if (gfc_traverse_expr (c->iterator->start, sym, func, f))
3223 if (gfc_traverse_expr (c->iterator->end, sym, func, f))
3225 if (gfc_traverse_expr (c->iterator->step, sym, func, f))
3232 if (gfc_traverse_expr (expr->value.op.op1, sym, func, f))
3234 if (gfc_traverse_expr (expr->value.op.op2, sym, func, f))
3250 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
3252 if (gfc_traverse_expr (ar.start[i], sym, func, f))
3254 if (gfc_traverse_expr (ar.end[i], sym, func, f))
3256 if (gfc_traverse_expr (ar.stride[i], sym, func, f))
3262 if (gfc_traverse_expr (ref->u.ss.start, sym, func, f))
3264 if (gfc_traverse_expr (ref->u.ss.end, sym, func, f))
3269 if (ref->u.c.component->ts.type == BT_CHARACTER
3270 && ref->u.c.component->ts.cl
3271 && ref->u.c.component->ts.cl->length
3272 && ref->u.c.component->ts.cl->length->expr_type
3274 && gfc_traverse_expr (ref->u.c.component->ts.cl->length,
3278 if (ref->u.c.component->as)
3279 for (i = 0; i < ref->u.c.component->as->rank; i++)
3281 if (gfc_traverse_expr (ref->u.c.component->as->lower[i],
3284 if (gfc_traverse_expr (ref->u.c.component->as->upper[i],
3298 /* Traverse expr, marking all EXPR_VARIABLE symbols referenced. */
3301 expr_set_symbols_referenced (gfc_expr *expr,
3302 gfc_symbol *sym ATTRIBUTE_UNUSED,
3303 int *f ATTRIBUTE_UNUSED)
3305 if (expr->expr_type != EXPR_VARIABLE)
3307 gfc_set_sym_referenced (expr->symtree->n.sym);
3312 gfc_expr_set_symbols_referenced (gfc_expr *expr)
3314 gfc_traverse_expr (expr, NULL, expr_set_symbols_referenced, 0);
3318 /* Walk an expression tree and check each variable encountered for being typed.
3319 If strict is not set, a top-level variable is tolerated untyped in -std=gnu
3320 mode; this is for things in legacy-code like:
3322 INTEGER :: arr(n), n
3324 The namespace is needed for IMPLICIT typing. */
3326 static gfc_namespace* check_typed_ns;
3329 expr_check_typed_help (gfc_expr* e, gfc_symbol* sym ATTRIBUTE_UNUSED,
3330 int* f ATTRIBUTE_UNUSED)
3334 if (e->expr_type != EXPR_VARIABLE)
3337 gcc_assert (e->symtree);
3338 t = gfc_check_symbol_typed (e->symtree->n.sym, check_typed_ns,
3341 return (t == FAILURE);
3345 gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict)
3349 /* If this is a top-level variable, do the check with strict given to us. */
3350 if (!strict && e->expr_type == EXPR_VARIABLE && !e->ref)
3351 return gfc_check_symbol_typed (e->symtree->n.sym, ns, strict, e->where);
3353 /* Otherwise, walk the expression and do it strictly. */
3354 check_typed_ns = ns;
3355 error_found = gfc_traverse_expr (e, NULL, &expr_check_typed_help, 0);
3357 return error_found ? FAILURE : SUCCESS;