2 Copyright (C) 2000, 2001, 2002, 2004, 2005, 2006, 2007
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 2, 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 COPYING. If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
28 /* This parameter is the size of the largest array constructor that we
29 will expand to an array constructor without iterators.
30 Constructors larger than this will remain in the iterator form. */
32 #define GFC_MAX_AC_EXPAND 65535
35 /**************** Array reference matching subroutines *****************/
37 /* Copy an array reference structure. */
40 gfc_copy_array_ref (gfc_array_ref *src)
48 dest = gfc_get_array_ref ();
52 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
54 dest->start[i] = gfc_copy_expr (src->start[i]);
55 dest->end[i] = gfc_copy_expr (src->end[i]);
56 dest->stride[i] = gfc_copy_expr (src->stride[i]);
59 dest->offset = gfc_copy_expr (src->offset);
65 /* Match a single dimension of an array reference. This can be a
66 single element or an array section. Any modifications we've made
67 to the ar structure are cleaned up by the caller. If the init
68 is set, we require the subscript to be a valid initialization
72 match_subscript (gfc_array_ref *ar, int init)
79 ar->c_where[i] = gfc_current_locus;
80 ar->start[i] = ar->end[i] = ar->stride[i] = NULL;
82 /* We can't be sure of the difference between DIMEN_ELEMENT and
83 DIMEN_VECTOR until we know the type of the element itself at
86 ar->dimen_type[i] = DIMEN_UNKNOWN;
88 if (gfc_match_char (':') == MATCH_YES)
91 /* Get start element. */
93 m = gfc_match_init_expr (&ar->start[i]);
95 m = gfc_match_expr (&ar->start[i]);
98 gfc_error ("Expected array subscript at %C");
102 if (gfc_match_char (':') == MATCH_NO)
105 /* Get an optional end element. Because we've seen the colon, we
106 definitely have a range along this dimension. */
108 ar->dimen_type[i] = DIMEN_RANGE;
111 m = gfc_match_init_expr (&ar->end[i]);
113 m = gfc_match_expr (&ar->end[i]);
115 if (m == MATCH_ERROR)
118 /* See if we have an optional stride. */
119 if (gfc_match_char (':') == MATCH_YES)
121 m = init ? gfc_match_init_expr (&ar->stride[i])
122 : gfc_match_expr (&ar->stride[i]);
125 gfc_error ("Expected array subscript stride at %C");
134 /* Match an array reference, whether it is the whole array or a
135 particular elements or a section. If init is set, the reference has
136 to consist of init expressions. */
139 gfc_match_array_ref (gfc_array_ref *ar, gfc_array_spec *as, int init)
143 memset (ar, '\0', sizeof (ar));
145 ar->where = gfc_current_locus;
148 if (gfc_match_char ('(') != MATCH_YES)
155 ar->type = AR_UNKNOWN;
157 for (ar->dimen = 0; ar->dimen < GFC_MAX_DIMENSIONS; ar->dimen++)
159 m = match_subscript (ar, init);
160 if (m == MATCH_ERROR)
163 if (gfc_match_char (')') == MATCH_YES)
166 if (gfc_match_char (',') != MATCH_YES)
168 gfc_error ("Invalid form of array reference at %C");
173 gfc_error ("Array reference at %C cannot have more than %d dimensions",
186 /************** Array specification matching subroutines ***************/
188 /* Free all of the expressions associated with array bounds
192 gfc_free_array_spec (gfc_array_spec *as)
199 for (i = 0; i < as->rank; i++)
201 gfc_free_expr (as->lower[i]);
202 gfc_free_expr (as->upper[i]);
209 /* Take an array bound, resolves the expression, that make up the
210 shape and check associated constraints. */
213 resolve_array_bound (gfc_expr *e, int check_constant)
218 if (gfc_resolve_expr (e) == FAILURE
219 || gfc_specification_expr (e) == FAILURE)
222 if (check_constant && gfc_is_constant_expr (e) == 0)
224 gfc_error ("Variable '%s' at %L in this context must be constant",
225 e->symtree->n.sym->name, &e->where);
233 /* Takes an array specification, resolves the expressions that make up
234 the shape and make sure everything is integral. */
237 gfc_resolve_array_spec (gfc_array_spec *as, int check_constant)
245 for (i = 0; i < as->rank; i++)
248 if (resolve_array_bound (e, check_constant) == FAILURE)
252 if (resolve_array_bound (e, check_constant) == FAILURE)
260 /* Match a single array element specification. The return values as
261 well as the upper and lower bounds of the array spec are filled
262 in according to what we see on the input. The caller makes sure
263 individual specifications make sense as a whole.
266 Parsed Lower Upper Returned
267 ------------------------------------
268 : NULL NULL AS_DEFERRED (*)
270 x: x NULL AS_ASSUMED_SHAPE
272 x:* x NULL AS_ASSUMED_SIZE
273 * 1 NULL AS_ASSUMED_SIZE
275 (*) For non-pointer dummy arrays this is AS_ASSUMED_SHAPE. This
276 is fixed during the resolution of formal interfaces.
278 Anything else AS_UNKNOWN. */
281 match_array_element_spec (gfc_array_spec *as)
283 gfc_expr **upper, **lower;
286 lower = &as->lower[as->rank - 1];
287 upper = &as->upper[as->rank - 1];
289 if (gfc_match_char ('*') == MATCH_YES)
291 *lower = gfc_int_expr (1);
292 return AS_ASSUMED_SIZE;
295 if (gfc_match_char (':') == MATCH_YES)
298 m = gfc_match_expr (upper);
300 gfc_error ("Expected expression in array specification at %C");
304 if (gfc_match_char (':') == MATCH_NO)
306 *lower = gfc_int_expr (1);
313 if (gfc_match_char ('*') == MATCH_YES)
314 return AS_ASSUMED_SIZE;
316 m = gfc_match_expr (upper);
317 if (m == MATCH_ERROR)
320 return AS_ASSUMED_SHAPE;
326 /* Matches an array specification, incidentally figuring out what sort
330 gfc_match_array_spec (gfc_array_spec **asp)
332 array_type current_type;
336 if (gfc_match_char ('(') != MATCH_YES)
342 as = gfc_get_array_spec ();
344 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
354 current_type = match_array_element_spec (as);
358 if (current_type == AS_UNKNOWN)
360 as->type = current_type;
364 { /* See how current spec meshes with the existing. */
369 if (current_type == AS_ASSUMED_SIZE)
371 as->type = AS_ASSUMED_SIZE;
375 if (current_type == AS_EXPLICIT)
378 gfc_error ("Bad array specification for an explicitly shaped "
383 case AS_ASSUMED_SHAPE:
384 if ((current_type == AS_ASSUMED_SHAPE)
385 || (current_type == AS_DEFERRED))
388 gfc_error ("Bad array specification for assumed shape "
393 if (current_type == AS_DEFERRED)
396 if (current_type == AS_ASSUMED_SHAPE)
398 as->type = AS_ASSUMED_SHAPE;
402 gfc_error ("Bad specification for deferred shape array at %C");
405 case AS_ASSUMED_SIZE:
406 gfc_error ("Bad specification for assumed size array at %C");
410 if (gfc_match_char (')') == MATCH_YES)
413 if (gfc_match_char (',') != MATCH_YES)
415 gfc_error ("Expected another dimension in array declaration at %C");
419 if (as->rank >= GFC_MAX_DIMENSIONS)
421 gfc_error ("Array specification at %C has more than %d dimensions",
429 /* If a lower bounds of an assumed shape array is blank, put in one. */
430 if (as->type == AS_ASSUMED_SHAPE)
432 for (i = 0; i < as->rank; i++)
434 if (as->lower[i] == NULL)
435 as->lower[i] = gfc_int_expr (1);
442 /* Something went wrong. */
443 gfc_free_array_spec (as);
448 /* Given a symbol and an array specification, modify the symbol to
449 have that array specification. The error locus is needed in case
450 something goes wrong. On failure, the caller must free the spec. */
453 gfc_set_array_spec (gfc_symbol *sym, gfc_array_spec *as, locus *error_loc)
458 if (gfc_add_dimension (&sym->attr, sym->name, error_loc) == FAILURE)
467 /* Copy an array specification. */
470 gfc_copy_array_spec (gfc_array_spec *src)
472 gfc_array_spec *dest;
478 dest = gfc_get_array_spec ();
482 for (i = 0; i < dest->rank; i++)
484 dest->lower[i] = gfc_copy_expr (dest->lower[i]);
485 dest->upper[i] = gfc_copy_expr (dest->upper[i]);
492 /* Returns nonzero if the two expressions are equal. Only handles integer
496 compare_bounds (gfc_expr *bound1, gfc_expr *bound2)
498 if (bound1 == NULL || bound2 == NULL
499 || bound1->expr_type != EXPR_CONSTANT
500 || bound2->expr_type != EXPR_CONSTANT
501 || bound1->ts.type != BT_INTEGER
502 || bound2->ts.type != BT_INTEGER)
503 gfc_internal_error ("gfc_compare_array_spec(): Array spec clobbered");
505 if (mpz_cmp (bound1->value.integer, bound2->value.integer) == 0)
512 /* Compares two array specifications. They must be constant or deferred
516 gfc_compare_array_spec (gfc_array_spec *as1, gfc_array_spec *as2)
520 if (as1 == NULL && as2 == NULL)
523 if (as1 == NULL || as2 == NULL)
526 if (as1->rank != as2->rank)
532 if (as1->type != as2->type)
535 if (as1->type == AS_EXPLICIT)
536 for (i = 0; i < as1->rank; i++)
538 if (compare_bounds (as1->lower[i], as2->lower[i]) == 0)
541 if (compare_bounds (as1->upper[i], as2->upper[i]) == 0)
549 /****************** Array constructor functions ******************/
551 /* Start an array constructor. The constructor starts with zero
552 elements and should be appended to by gfc_append_constructor(). */
555 gfc_start_constructor (bt type, int kind, locus *where)
559 result = gfc_get_expr ();
561 result->expr_type = EXPR_ARRAY;
564 result->ts.type = type;
565 result->ts.kind = kind;
566 result->where = *where;
571 /* Given an array constructor expression, append the new expression
572 node onto the constructor. */
575 gfc_append_constructor (gfc_expr *base, gfc_expr *new)
579 if (base->value.constructor == NULL)
580 base->value.constructor = c = gfc_get_constructor ();
583 c = base->value.constructor;
587 c->next = gfc_get_constructor ();
593 if (new->ts.type != base->ts.type || new->ts.kind != base->ts.kind)
594 gfc_internal_error ("gfc_append_constructor(): New node has wrong kind");
598 /* Given an array constructor expression, insert the new expression's
599 constructor onto the base's one according to the offset. */
602 gfc_insert_constructor (gfc_expr *base, gfc_constructor *c1)
604 gfc_constructor *c, *pre;
608 type = base->expr_type;
610 if (base->value.constructor == NULL)
611 base->value.constructor = c1;
614 c = pre = base->value.constructor;
617 if (type == EXPR_ARRAY)
619 t = mpz_cmp (c->n.offset, c1->n.offset);
627 gfc_error ("duplicated initializer");
648 base->value.constructor = c1;
654 /* Get a new constructor. */
657 gfc_get_constructor (void)
661 c = gfc_getmem (sizeof(gfc_constructor));
665 mpz_init_set_si (c->n.offset, 0);
666 mpz_init_set_si (c->repeat, 0);
671 /* Free chains of gfc_constructor structures. */
674 gfc_free_constructor (gfc_constructor *p)
676 gfc_constructor *next;
686 gfc_free_expr (p->expr);
687 if (p->iterator != NULL)
688 gfc_free_iterator (p->iterator, 1);
689 mpz_clear (p->n.offset);
690 mpz_clear (p->repeat);
696 /* Given an expression node that might be an array constructor and a
697 symbol, make sure that no iterators in this or child constructors
698 use the symbol as an implied-DO iterator. Returns nonzero if a
699 duplicate was found. */
702 check_duplicate_iterator (gfc_constructor *c, gfc_symbol *master)
706 for (; c; c = c->next)
710 if (e->expr_type == EXPR_ARRAY
711 && check_duplicate_iterator (e->value.constructor, master))
714 if (c->iterator == NULL)
717 if (c->iterator->var->symtree->n.sym == master)
719 gfc_error ("DO-iterator '%s' at %L is inside iterator of the "
720 "same name", master->name, &c->where);
730 /* Forward declaration because these functions are mutually recursive. */
731 static match match_array_cons_element (gfc_constructor **);
733 /* Match a list of array elements. */
736 match_array_list (gfc_constructor **result)
738 gfc_constructor *p, *head, *tail, *new;
745 old_loc = gfc_current_locus;
747 if (gfc_match_char ('(') == MATCH_NO)
750 memset (&iter, '\0', sizeof (gfc_iterator));
753 m = match_array_cons_element (&head);
759 if (gfc_match_char (',') != MATCH_YES)
767 m = gfc_match_iterator (&iter, 0);
770 if (m == MATCH_ERROR)
773 m = match_array_cons_element (&new);
774 if (m == MATCH_ERROR)
781 goto cleanup; /* Could be a complex constant */
787 if (gfc_match_char (',') != MATCH_YES)
796 if (gfc_match_char (')') != MATCH_YES)
799 if (check_duplicate_iterator (head, iter.var->symtree->n.sym))
806 e->expr_type = EXPR_ARRAY;
808 e->value.constructor = head;
810 p = gfc_get_constructor ();
811 p->where = gfc_current_locus;
812 p->iterator = gfc_get_iterator ();
821 gfc_error ("Syntax error in array constructor at %C");
825 gfc_free_constructor (head);
826 gfc_free_iterator (&iter, 0);
827 gfc_current_locus = old_loc;
832 /* Match a single element of an array constructor, which can be a
833 single expression or a list of elements. */
836 match_array_cons_element (gfc_constructor **result)
842 m = match_array_list (result);
846 m = gfc_match_expr (&expr);
850 p = gfc_get_constructor ();
851 p->where = gfc_current_locus;
859 /* Match an array constructor. */
862 gfc_match_array_constructor (gfc_expr **result)
864 gfc_constructor *head, *tail, *new;
868 const char *end_delim;
870 if (gfc_match (" (/") == MATCH_NO)
872 if (gfc_match (" [") == MATCH_NO)
876 if (gfc_notify_std (GFC_STD_F2003, "Fortran 2003: [...] "
877 "style array constructors at %C") == FAILURE)
885 where = gfc_current_locus;
888 if (gfc_match (end_delim) == MATCH_YES)
890 gfc_error ("Empty array constructor at %C is not allowed");
896 m = match_array_cons_element (&new);
897 if (m == MATCH_ERROR)
909 if (gfc_match_char (',') == MATCH_NO)
913 if (gfc_match (end_delim) == MATCH_NO)
916 expr = gfc_get_expr ();
918 expr->expr_type = EXPR_ARRAY;
920 expr->value.constructor = head;
921 /* Size must be calculated at resolution time. */
930 gfc_error ("Syntax error in array constructor at %C");
933 gfc_free_constructor (head);
939 /************** Check array constructors for correctness **************/
941 /* Given an expression, compare it's type with the type of the current
942 constructor. Returns nonzero if an error was issued. The
943 cons_state variable keeps track of whether the type of the
944 constructor being read or resolved is known to be good, bad or just
947 static gfc_typespec constructor_ts;
949 { CONS_START, CONS_GOOD, CONS_BAD }
953 check_element_type (gfc_expr *expr)
955 if (cons_state == CONS_BAD)
956 return 0; /* Suppress further errors */
958 if (cons_state == CONS_START)
960 if (expr->ts.type == BT_UNKNOWN)
961 cons_state = CONS_BAD;
964 cons_state = CONS_GOOD;
965 constructor_ts = expr->ts;
971 if (gfc_compare_types (&constructor_ts, &expr->ts))
974 gfc_error ("Element in %s array constructor at %L is %s",
975 gfc_typename (&constructor_ts), &expr->where,
976 gfc_typename (&expr->ts));
978 cons_state = CONS_BAD;
983 /* Recursive work function for gfc_check_constructor_type(). */
986 check_constructor_type (gfc_constructor *c)
990 for (; c; c = c->next)
994 if (e->expr_type == EXPR_ARRAY)
996 if (check_constructor_type (e->value.constructor) == FAILURE)
1002 if (check_element_type (e))
1010 /* Check that all elements of an array constructor are the same type.
1011 On FAILURE, an error has been generated. */
1014 gfc_check_constructor_type (gfc_expr *e)
1018 cons_state = CONS_START;
1019 gfc_clear_ts (&constructor_ts);
1021 t = check_constructor_type (e->value.constructor);
1022 if (t == SUCCESS && e->ts.type == BT_UNKNOWN)
1023 e->ts = constructor_ts;
1030 typedef struct cons_stack
1032 gfc_iterator *iterator;
1033 struct cons_stack *previous;
1037 static cons_stack *base;
1039 static try check_constructor (gfc_constructor *, try (*) (gfc_expr *));
1041 /* Check an EXPR_VARIABLE expression in a constructor to make sure
1042 that that variable is an iteration variables. */
1045 gfc_check_iter_variable (gfc_expr *expr)
1050 sym = expr->symtree->n.sym;
1052 for (c = base; c; c = c->previous)
1053 if (sym == c->iterator->var->symtree->n.sym)
1060 /* Recursive work function for gfc_check_constructor(). This amounts
1061 to calling the check function for each expression in the
1062 constructor, giving variables with the names of iterators a pass. */
1065 check_constructor (gfc_constructor *c, try (*check_function) (gfc_expr *))
1071 for (; c; c = c->next)
1075 if (e->expr_type != EXPR_ARRAY)
1077 if ((*check_function) (e) == FAILURE)
1082 element.previous = base;
1083 element.iterator = c->iterator;
1086 t = check_constructor (e->value.constructor, check_function);
1087 base = element.previous;
1093 /* Nothing went wrong, so all OK. */
1098 /* Checks a constructor to see if it is a particular kind of
1099 expression -- specification, restricted, or initialization as
1100 determined by the check_function. */
1103 gfc_check_constructor (gfc_expr *expr, try (*check_function) (gfc_expr *))
1105 cons_stack *base_save;
1111 t = check_constructor (expr->value.constructor, check_function);
1119 /**************** Simplification of array constructors ****************/
1121 iterator_stack *iter_stack;
1125 gfc_constructor *new_head, *new_tail;
1126 int extract_count, extract_n;
1127 gfc_expr *extracted;
1131 gfc_component *component;
1134 try (*expand_work_function) (gfc_expr *);
1138 static expand_info current_expand;
1140 static try expand_constructor (gfc_constructor *);
1143 /* Work function that counts the number of elements present in a
1147 count_elements (gfc_expr *e)
1152 mpz_add_ui (*current_expand.count, *current_expand.count, 1);
1155 if (gfc_array_size (e, &result) == FAILURE)
1161 mpz_add (*current_expand.count, *current_expand.count, result);
1170 /* Work function that extracts a particular element from an array
1171 constructor, freeing the rest. */
1174 extract_element (gfc_expr *e)
1178 { /* Something unextractable */
1183 if (current_expand.extract_count == current_expand.extract_n)
1184 current_expand.extracted = e;
1188 current_expand.extract_count++;
1193 /* Work function that constructs a new constructor out of the old one,
1194 stringing new elements together. */
1197 expand (gfc_expr *e)
1199 if (current_expand.new_head == NULL)
1200 current_expand.new_head = current_expand.new_tail =
1201 gfc_get_constructor ();
1204 current_expand.new_tail->next = gfc_get_constructor ();
1205 current_expand.new_tail = current_expand.new_tail->next;
1208 current_expand.new_tail->where = e->where;
1209 current_expand.new_tail->expr = e;
1211 mpz_set (current_expand.new_tail->n.offset, *current_expand.offset);
1212 current_expand.new_tail->n.component = current_expand.component;
1213 mpz_set (current_expand.new_tail->repeat, *current_expand.repeat);
1218 /* Given an initialization expression that is a variable reference,
1219 substitute the current value of the iteration variable. */
1222 gfc_simplify_iterator_var (gfc_expr *e)
1226 for (p = iter_stack; p; p = p->prev)
1227 if (e->symtree == p->variable)
1231 return; /* Variable not found */
1233 gfc_replace_expr (e, gfc_int_expr (0));
1235 mpz_set (e->value.integer, p->value);
1241 /* Expand an expression with that is inside of a constructor,
1242 recursing into other constructors if present. */
1245 expand_expr (gfc_expr *e)
1247 if (e->expr_type == EXPR_ARRAY)
1248 return expand_constructor (e->value.constructor);
1250 e = gfc_copy_expr (e);
1252 if (gfc_simplify_expr (e, 1) == FAILURE)
1258 return current_expand.expand_work_function (e);
1263 expand_iterator (gfc_constructor *c)
1265 gfc_expr *start, *end, *step;
1266 iterator_stack frame;
1275 mpz_init (frame.value);
1277 start = gfc_copy_expr (c->iterator->start);
1278 if (gfc_simplify_expr (start, 1) == FAILURE)
1281 if (start->expr_type != EXPR_CONSTANT || start->ts.type != BT_INTEGER)
1284 end = gfc_copy_expr (c->iterator->end);
1285 if (gfc_simplify_expr (end, 1) == FAILURE)
1288 if (end->expr_type != EXPR_CONSTANT || end->ts.type != BT_INTEGER)
1291 step = gfc_copy_expr (c->iterator->step);
1292 if (gfc_simplify_expr (step, 1) == FAILURE)
1295 if (step->expr_type != EXPR_CONSTANT || step->ts.type != BT_INTEGER)
1298 if (mpz_sgn (step->value.integer) == 0)
1300 gfc_error ("Iterator step at %L cannot be zero", &step->where);
1304 /* Calculate the trip count of the loop. */
1305 mpz_sub (trip, end->value.integer, start->value.integer);
1306 mpz_add (trip, trip, step->value.integer);
1307 mpz_tdiv_q (trip, trip, step->value.integer);
1309 mpz_set (frame.value, start->value.integer);
1311 frame.prev = iter_stack;
1312 frame.variable = c->iterator->var->symtree;
1313 iter_stack = &frame;
1315 while (mpz_sgn (trip) > 0)
1317 if (expand_expr (c->expr) == FAILURE)
1320 mpz_add (frame.value, frame.value, step->value.integer);
1321 mpz_sub_ui (trip, trip, 1);
1327 gfc_free_expr (start);
1328 gfc_free_expr (end);
1329 gfc_free_expr (step);
1332 mpz_clear (frame.value);
1334 iter_stack = frame.prev;
1340 /* Expand a constructor into constant constructors without any
1341 iterators, calling the work function for each of the expanded
1342 expressions. The work function needs to either save or free the
1343 passed expression. */
1346 expand_constructor (gfc_constructor *c)
1350 for (; c; c = c->next)
1352 if (c->iterator != NULL)
1354 if (expand_iterator (c) == FAILURE)
1361 if (e->expr_type == EXPR_ARRAY)
1363 if (expand_constructor (e->value.constructor) == FAILURE)
1369 e = gfc_copy_expr (e);
1370 if (gfc_simplify_expr (e, 1) == FAILURE)
1375 current_expand.offset = &c->n.offset;
1376 current_expand.component = c->n.component;
1377 current_expand.repeat = &c->repeat;
1378 if (current_expand.expand_work_function (e) == FAILURE)
1385 /* Top level subroutine for expanding constructors. We only expand
1386 constructor if they are small enough. */
1389 gfc_expand_constructor (gfc_expr *e)
1391 expand_info expand_save;
1395 f = gfc_get_array_element (e, GFC_MAX_AC_EXPAND);
1402 expand_save = current_expand;
1403 current_expand.new_head = current_expand.new_tail = NULL;
1407 current_expand.expand_work_function = expand;
1409 if (expand_constructor (e->value.constructor) == FAILURE)
1411 gfc_free_constructor (current_expand.new_head);
1416 gfc_free_constructor (e->value.constructor);
1417 e->value.constructor = current_expand.new_head;
1422 current_expand = expand_save;
1428 /* Work function for checking that an element of a constructor is a
1429 constant, after removal of any iteration variables. We return
1430 FAILURE if not so. */
1433 constant_element (gfc_expr *e)
1437 rv = gfc_is_constant_expr (e);
1440 return rv ? SUCCESS : FAILURE;
1444 /* Given an array constructor, determine if the constructor is
1445 constant or not by expanding it and making sure that all elements
1446 are constants. This is a bit of a hack since something like (/ (i,
1447 i=1,100000000) /) will take a while as* opposed to a more clever
1448 function that traverses the expression tree. FIXME. */
1451 gfc_constant_ac (gfc_expr *e)
1453 expand_info expand_save;
1457 expand_save = current_expand;
1458 current_expand.expand_work_function = constant_element;
1460 rc = expand_constructor (e->value.constructor);
1462 current_expand = expand_save;
1470 /* Returns nonzero if an array constructor has been completely
1471 expanded (no iterators) and zero if iterators are present. */
1474 gfc_expanded_ac (gfc_expr *e)
1478 if (e->expr_type == EXPR_ARRAY)
1479 for (p = e->value.constructor; p; p = p->next)
1480 if (p->iterator != NULL || !gfc_expanded_ac (p->expr))
1487 /*************** Type resolution of array constructors ***************/
1489 /* Recursive array list resolution function. All of the elements must
1490 be of the same type. */
1493 resolve_array_list (gfc_constructor *p)
1499 for (; p; p = p->next)
1501 if (p->iterator != NULL
1502 && gfc_resolve_iterator (p->iterator, false) == FAILURE)
1505 if (gfc_resolve_expr (p->expr) == FAILURE)
1512 /* Resolve character array constructor. If it is a constant character array and
1513 not specified character length, update character length to the maximum of
1514 its element constructors' length. */
1517 gfc_resolve_character_array_constructor (gfc_expr *expr)
1522 gcc_assert (expr->expr_type == EXPR_ARRAY);
1523 gcc_assert (expr->ts.type == BT_CHARACTER);
1527 if (expr->ts.cl == NULL)
1529 for (p = expr->value.constructor; p; p = p->next)
1530 if (p->expr->ts.cl != NULL)
1532 /* Ensure that if there is a char_len around that it is
1533 used; otherwise the middle-end confuses them! */
1534 expr->ts.cl = p->expr->ts.cl;
1538 expr->ts.cl = gfc_get_charlen ();
1539 expr->ts.cl->next = gfc_current_ns->cl_list;
1540 gfc_current_ns->cl_list = expr->ts.cl;
1545 if (expr->ts.cl->length == NULL)
1547 /* Find the maximum length of the elements. Do nothing for variable
1548 array constructor, unless the character length is constant or
1549 there is a constant substring reference. */
1551 for (p = expr->value.constructor; p; p = p->next)
1554 for (ref = p->expr->ref; ref; ref = ref->next)
1555 if (ref->type == REF_SUBSTRING
1556 && ref->u.ss.start->expr_type == EXPR_CONSTANT
1557 && ref->u.ss.end->expr_type == EXPR_CONSTANT)
1560 if (p->expr->expr_type == EXPR_CONSTANT)
1561 max_length = MAX (p->expr->value.character.length, max_length);
1565 j = mpz_get_ui (ref->u.ss.end->value.integer)
1566 - mpz_get_ui (ref->u.ss.start->value.integer) + 1;
1567 max_length = MAX ((int) j, max_length);
1569 else if (p->expr->ts.cl && p->expr->ts.cl->length
1570 && p->expr->ts.cl->length->expr_type == EXPR_CONSTANT)
1573 j = mpz_get_si (p->expr->ts.cl->length->value.integer);
1574 max_length = MAX ((int) j, max_length);
1580 if (max_length != -1)
1582 /* Update the character length of the array constructor. */
1583 expr->ts.cl->length = gfc_int_expr (max_length);
1584 /* Update the element constructors. */
1585 for (p = expr->value.constructor; p; p = p->next)
1586 if (p->expr->expr_type == EXPR_CONSTANT)
1587 gfc_set_constant_character_len (max_length, p->expr, true);
1593 /* Resolve all of the expressions in an array list. */
1596 gfc_resolve_array_constructor (gfc_expr *expr)
1600 t = resolve_array_list (expr->value.constructor);
1602 t = gfc_check_constructor_type (expr);
1603 if (t == SUCCESS && expr->ts.type == BT_CHARACTER)
1604 gfc_resolve_character_array_constructor (expr);
1610 /* Copy an iterator structure. */
1612 static gfc_iterator *
1613 copy_iterator (gfc_iterator *src)
1620 dest = gfc_get_iterator ();
1622 dest->var = gfc_copy_expr (src->var);
1623 dest->start = gfc_copy_expr (src->start);
1624 dest->end = gfc_copy_expr (src->end);
1625 dest->step = gfc_copy_expr (src->step);
1631 /* Copy a constructor structure. */
1634 gfc_copy_constructor (gfc_constructor *src)
1636 gfc_constructor *dest;
1637 gfc_constructor *tail;
1646 dest = tail = gfc_get_constructor ();
1649 tail->next = gfc_get_constructor ();
1652 tail->where = src->where;
1653 tail->expr = gfc_copy_expr (src->expr);
1654 tail->iterator = copy_iterator (src->iterator);
1655 mpz_set (tail->n.offset, src->n.offset);
1656 tail->n.component = src->n.component;
1657 mpz_set (tail->repeat, src->repeat);
1665 /* Given an array expression and an element number (starting at zero),
1666 return a pointer to the array element. NULL is returned if the
1667 size of the array has been exceeded. The expression node returned
1668 remains a part of the array and should not be freed. Access is not
1669 efficient at all, but this is another place where things do not
1670 have to be particularly fast. */
1673 gfc_get_array_element (gfc_expr *array, int element)
1675 expand_info expand_save;
1679 expand_save = current_expand;
1680 current_expand.extract_n = element;
1681 current_expand.expand_work_function = extract_element;
1682 current_expand.extracted = NULL;
1683 current_expand.extract_count = 0;
1687 rc = expand_constructor (array->value.constructor);
1688 e = current_expand.extracted;
1689 current_expand = expand_save;
1698 /********* Subroutines for determining the size of an array *********/
1700 /* These are needed just to accommodate RESHAPE(). There are no
1701 diagnostics here, we just return a negative number if something
1705 /* Get the size of single dimension of an array specification. The
1706 array is guaranteed to be one dimensional. */
1709 spec_dimen_size (gfc_array_spec *as, int dimen, mpz_t *result)
1714 if (dimen < 0 || dimen > as->rank - 1)
1715 gfc_internal_error ("spec_dimen_size(): Bad dimension");
1717 if (as->type != AS_EXPLICIT
1718 || as->lower[dimen]->expr_type != EXPR_CONSTANT
1719 || as->upper[dimen]->expr_type != EXPR_CONSTANT)
1724 mpz_sub (*result, as->upper[dimen]->value.integer,
1725 as->lower[dimen]->value.integer);
1727 mpz_add_ui (*result, *result, 1);
1734 spec_size (gfc_array_spec *as, mpz_t *result)
1739 mpz_init_set_ui (*result, 1);
1741 for (d = 0; d < as->rank; d++)
1743 if (spec_dimen_size (as, d, &size) == FAILURE)
1745 mpz_clear (*result);
1749 mpz_mul (*result, *result, size);
1757 /* Get the number of elements in an array section. */
1760 ref_dimen_size (gfc_array_ref *ar, int dimen, mpz_t *result)
1762 mpz_t upper, lower, stride;
1765 if (dimen < 0 || ar == NULL || dimen > ar->dimen - 1)
1766 gfc_internal_error ("ref_dimen_size(): Bad dimension");
1768 switch (ar->dimen_type[dimen])
1772 mpz_set_ui (*result, 1);
1777 t = gfc_array_size (ar->start[dimen], result); /* Recurse! */
1786 if (ar->start[dimen] == NULL)
1788 if (ar->as->lower[dimen] == NULL
1789 || ar->as->lower[dimen]->expr_type != EXPR_CONSTANT)
1791 mpz_set (lower, ar->as->lower[dimen]->value.integer);
1795 if (ar->start[dimen]->expr_type != EXPR_CONSTANT)
1797 mpz_set (lower, ar->start[dimen]->value.integer);
1800 if (ar->end[dimen] == NULL)
1802 if (ar->as->upper[dimen] == NULL
1803 || ar->as->upper[dimen]->expr_type != EXPR_CONSTANT)
1805 mpz_set (upper, ar->as->upper[dimen]->value.integer);
1809 if (ar->end[dimen]->expr_type != EXPR_CONSTANT)
1811 mpz_set (upper, ar->end[dimen]->value.integer);
1814 if (ar->stride[dimen] == NULL)
1815 mpz_set_ui (stride, 1);
1818 if (ar->stride[dimen]->expr_type != EXPR_CONSTANT)
1820 mpz_set (stride, ar->stride[dimen]->value.integer);
1824 mpz_sub (*result, upper, lower);
1825 mpz_add (*result, *result, stride);
1826 mpz_div (*result, *result, stride);
1828 /* Zero stride caught earlier. */
1829 if (mpz_cmp_ui (*result, 0) < 0)
1830 mpz_set_ui (*result, 0);
1840 gfc_internal_error ("ref_dimen_size(): Bad dimen_type");
1848 ref_size (gfc_array_ref *ar, mpz_t *result)
1853 mpz_init_set_ui (*result, 1);
1855 for (d = 0; d < ar->dimen; d++)
1857 if (ref_dimen_size (ar, d, &size) == FAILURE)
1859 mpz_clear (*result);
1863 mpz_mul (*result, *result, size);
1871 /* Given an array expression and a dimension, figure out how many
1872 elements it has along that dimension. Returns SUCCESS if we were
1873 able to return a result in the 'result' variable, FAILURE
1877 gfc_array_dimen_size (gfc_expr *array, int dimen, mpz_t *result)
1882 if (dimen < 0 || array == NULL || dimen > array->rank - 1)
1883 gfc_internal_error ("gfc_array_dimen_size(): Bad dimension");
1885 switch (array->expr_type)
1889 for (ref = array->ref; ref; ref = ref->next)
1891 if (ref->type != REF_ARRAY)
1894 if (ref->u.ar.type == AR_FULL)
1895 return spec_dimen_size (ref->u.ar.as, dimen, result);
1897 if (ref->u.ar.type == AR_SECTION)
1899 for (i = 0; dimen >= 0; i++)
1900 if (ref->u.ar.dimen_type[i] != DIMEN_ELEMENT)
1903 return ref_dimen_size (&ref->u.ar, i - 1, result);
1907 if (array->shape && array->shape[dimen])
1909 mpz_init_set (*result, array->shape[dimen]);
1913 if (spec_dimen_size (array->symtree->n.sym->as, dimen, result) == FAILURE)
1919 if (array->shape == NULL) {
1920 /* Expressions with rank > 1 should have "shape" properly set */
1921 if ( array->rank != 1 )
1922 gfc_internal_error ("gfc_array_dimen_size(): Bad EXPR_ARRAY expr");
1923 return gfc_array_size(array, result);
1928 if (array->shape == NULL)
1931 mpz_init_set (*result, array->shape[dimen]);
1940 /* Given an array expression, figure out how many elements are in the
1941 array. Returns SUCCESS if this is possible, and sets the 'result'
1942 variable. Otherwise returns FAILURE. */
1945 gfc_array_size (gfc_expr *array, mpz_t *result)
1947 expand_info expand_save;
1952 switch (array->expr_type)
1955 flag = gfc_suppress_error;
1956 gfc_suppress_error = 1;
1958 expand_save = current_expand;
1960 current_expand.count = result;
1961 mpz_init_set_ui (*result, 0);
1963 current_expand.expand_work_function = count_elements;
1966 t = expand_constructor (array->value.constructor);
1967 gfc_suppress_error = flag;
1970 mpz_clear (*result);
1971 current_expand = expand_save;
1975 for (ref = array->ref; ref; ref = ref->next)
1977 if (ref->type != REF_ARRAY)
1980 if (ref->u.ar.type == AR_FULL)
1981 return spec_size (ref->u.ar.as, result);
1983 if (ref->u.ar.type == AR_SECTION)
1984 return ref_size (&ref->u.ar, result);
1987 return spec_size (array->symtree->n.sym->as, result);
1991 if (array->rank == 0 || array->shape == NULL)
1994 mpz_init_set_ui (*result, 1);
1996 for (i = 0; i < array->rank; i++)
1997 mpz_mul (*result, *result, array->shape[i]);
2006 /* Given an array reference, return the shape of the reference in an
2007 array of mpz_t integers. */
2010 gfc_array_ref_shape (gfc_array_ref *ar, mpz_t *shape)
2020 for (; d < ar->as->rank; d++)
2021 if (spec_dimen_size (ar->as, d, &shape[d]) == FAILURE)
2027 for (i = 0; i < ar->dimen; i++)
2029 if (ar->dimen_type[i] != DIMEN_ELEMENT)
2031 if (ref_dimen_size (ar, i, &shape[d]) == FAILURE)
2044 for (d--; d >= 0; d--)
2045 mpz_clear (shape[d]);
2051 /* Given an array expression, find the array reference structure that
2052 characterizes the reference. */
2055 gfc_find_array_ref (gfc_expr *e)
2059 for (ref = e->ref; ref; ref = ref->next)
2060 if (ref->type == REF_ARRAY
2061 && (ref->u.ar.type == AR_FULL || ref->u.ar.type == AR_SECTION))
2065 gfc_internal_error ("gfc_find_array_ref(): No ref found");
2071 /* Find out if an array shape is known at compile time. */
2074 gfc_is_compile_time_shape (gfc_array_spec *as)
2078 if (as->type != AS_EXPLICIT)
2081 for (i = 0; i < as->rank; i++)
2082 if (!gfc_is_constant_expr (as->lower[i])
2083 || !gfc_is_constant_expr (as->upper[i]))