]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/fortran/array.c
re PR fortran/85521 (ICE in gfc_resolve_character_array_constructor, at fortran/array...
[thirdparty/gcc.git] / gcc / fortran / array.c
1 /* Array things
2 Copyright (C) 2000-2018 Free Software Foundation, Inc.
3 Contributed by Andy Vaught
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "options.h"
25 #include "gfortran.h"
26 #include "match.h"
27 #include "constructor.h"
28
29 /**************** Array reference matching subroutines *****************/
30
31 /* Copy an array reference structure. */
32
33 gfc_array_ref *
34 gfc_copy_array_ref (gfc_array_ref *src)
35 {
36 gfc_array_ref *dest;
37 int i;
38
39 if (src == NULL)
40 return NULL;
41
42 dest = gfc_get_array_ref ();
43
44 *dest = *src;
45
46 for (i = 0; i < GFC_MAX_DIMENSIONS; i++)
47 {
48 dest->start[i] = gfc_copy_expr (src->start[i]);
49 dest->end[i] = gfc_copy_expr (src->end[i]);
50 dest->stride[i] = gfc_copy_expr (src->stride[i]);
51 }
52
53 return dest;
54 }
55
56
57 /* Match a single dimension of an array reference. This can be a
58 single element or an array section. Any modifications we've made
59 to the ar structure are cleaned up by the caller. If the init
60 is set, we require the subscript to be a valid initialization
61 expression. */
62
63 static match
64 match_subscript (gfc_array_ref *ar, int init, bool match_star)
65 {
66 match m = MATCH_ERROR;
67 bool star = false;
68 int i;
69
70 i = ar->dimen + ar->codimen;
71
72 gfc_gobble_whitespace ();
73 ar->c_where[i] = gfc_current_locus;
74 ar->start[i] = ar->end[i] = ar->stride[i] = NULL;
75
76 /* We can't be sure of the difference between DIMEN_ELEMENT and
77 DIMEN_VECTOR until we know the type of the element itself at
78 resolution time. */
79
80 ar->dimen_type[i] = DIMEN_UNKNOWN;
81
82 if (gfc_match_char (':') == MATCH_YES)
83 goto end_element;
84
85 /* Get start element. */
86 if (match_star && (m = gfc_match_char ('*')) == MATCH_YES)
87 star = true;
88
89 if (!star && init)
90 m = gfc_match_init_expr (&ar->start[i]);
91 else if (!star)
92 m = gfc_match_expr (&ar->start[i]);
93
94 if (m == MATCH_NO)
95 gfc_error ("Expected array subscript at %C");
96 if (m != MATCH_YES)
97 return MATCH_ERROR;
98
99 if (gfc_match_char (':') == MATCH_NO)
100 goto matched;
101
102 if (star)
103 {
104 gfc_error ("Unexpected %<*%> in coarray subscript at %C");
105 return MATCH_ERROR;
106 }
107
108 /* Get an optional end element. Because we've seen the colon, we
109 definitely have a range along this dimension. */
110 end_element:
111 ar->dimen_type[i] = DIMEN_RANGE;
112
113 if (match_star && (m = gfc_match_char ('*')) == MATCH_YES)
114 star = true;
115 else if (init)
116 m = gfc_match_init_expr (&ar->end[i]);
117 else
118 m = gfc_match_expr (&ar->end[i]);
119
120 if (m == MATCH_ERROR)
121 return MATCH_ERROR;
122
123 /* See if we have an optional stride. */
124 if (gfc_match_char (':') == MATCH_YES)
125 {
126 if (star)
127 {
128 gfc_error ("Strides not allowed in coarray subscript at %C");
129 return MATCH_ERROR;
130 }
131
132 m = init ? gfc_match_init_expr (&ar->stride[i])
133 : gfc_match_expr (&ar->stride[i]);
134
135 if (m == MATCH_NO)
136 gfc_error ("Expected array subscript stride at %C");
137 if (m != MATCH_YES)
138 return MATCH_ERROR;
139 }
140
141 matched:
142 if (star)
143 ar->dimen_type[i] = DIMEN_STAR;
144
145 return MATCH_YES;
146 }
147
148
149 /* Match an array reference, whether it is the whole array or particular
150 elements or a section. If init is set, the reference has to consist
151 of init expressions. */
152
153 match
154 gfc_match_array_ref (gfc_array_ref *ar, gfc_array_spec *as, int init,
155 int corank)
156 {
157 match m;
158 bool matched_bracket = false;
159 gfc_expr *tmp;
160 bool stat_just_seen = false;
161 bool team_just_seen = false;
162
163 memset (ar, '\0', sizeof (*ar));
164
165 ar->where = gfc_current_locus;
166 ar->as = as;
167 ar->type = AR_UNKNOWN;
168
169 if (gfc_match_char ('[') == MATCH_YES)
170 {
171 matched_bracket = true;
172 goto coarray;
173 }
174
175 if (gfc_match_char ('(') != MATCH_YES)
176 {
177 ar->type = AR_FULL;
178 ar->dimen = 0;
179 return MATCH_YES;
180 }
181
182 for (ar->dimen = 0; ar->dimen < GFC_MAX_DIMENSIONS; ar->dimen++)
183 {
184 m = match_subscript (ar, init, false);
185 if (m == MATCH_ERROR)
186 return MATCH_ERROR;
187
188 if (gfc_match_char (')') == MATCH_YES)
189 {
190 ar->dimen++;
191 goto coarray;
192 }
193
194 if (gfc_match_char (',') != MATCH_YES)
195 {
196 gfc_error ("Invalid form of array reference at %C");
197 return MATCH_ERROR;
198 }
199 }
200
201 if (ar->dimen >= 7
202 && !gfc_notify_std (GFC_STD_F2008,
203 "Array reference at %C has more than 7 dimensions"))
204 return MATCH_ERROR;
205
206 gfc_error ("Array reference at %C cannot have more than %d dimensions",
207 GFC_MAX_DIMENSIONS);
208 return MATCH_ERROR;
209
210 coarray:
211 if (!matched_bracket && gfc_match_char ('[') != MATCH_YES)
212 {
213 if (ar->dimen > 0)
214 return MATCH_YES;
215 else
216 return MATCH_ERROR;
217 }
218
219 if (flag_coarray == GFC_FCOARRAY_NONE)
220 {
221 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
222 return MATCH_ERROR;
223 }
224
225 if (corank == 0)
226 {
227 gfc_error ("Unexpected coarray designator at %C");
228 return MATCH_ERROR;
229 }
230
231 ar->stat = NULL;
232
233 for (ar->codimen = 0; ar->codimen + ar->dimen < GFC_MAX_DIMENSIONS; ar->codimen++)
234 {
235 m = match_subscript (ar, init, true);
236 if (m == MATCH_ERROR)
237 return MATCH_ERROR;
238
239 team_just_seen = false;
240 stat_just_seen = false;
241 if (gfc_match (" , team = %e", &tmp) == MATCH_YES && ar->team == NULL)
242 {
243 ar->team = tmp;
244 team_just_seen = true;
245 }
246
247 if (ar->team && !team_just_seen)
248 {
249 gfc_error ("TEAM= attribute in %C misplaced");
250 return MATCH_ERROR;
251 }
252
253 if (gfc_match (" , stat = %e",&tmp) == MATCH_YES && ar->stat == NULL)
254 {
255 ar->stat = tmp;
256 stat_just_seen = true;
257 }
258
259 if (ar->stat && !stat_just_seen)
260 {
261 gfc_error ("STAT= attribute in %C misplaced");
262 return MATCH_ERROR;
263 }
264
265 if (gfc_match_char (']') == MATCH_YES)
266 {
267 ar->codimen++;
268 if (ar->codimen < corank)
269 {
270 gfc_error ("Too few codimensions at %C, expected %d not %d",
271 corank, ar->codimen);
272 return MATCH_ERROR;
273 }
274 if (ar->codimen > corank)
275 {
276 gfc_error ("Too many codimensions at %C, expected %d not %d",
277 corank, ar->codimen);
278 return MATCH_ERROR;
279 }
280 return MATCH_YES;
281 }
282
283 if (gfc_match_char (',') != MATCH_YES)
284 {
285 if (gfc_match_char ('*') == MATCH_YES)
286 gfc_error ("Unexpected %<*%> for codimension %d of %d at %C",
287 ar->codimen + 1, corank);
288 else
289 gfc_error ("Invalid form of coarray reference at %C");
290 return MATCH_ERROR;
291 }
292 else if (ar->dimen_type[ar->codimen + ar->dimen] == DIMEN_STAR)
293 {
294 gfc_error ("Unexpected %<*%> for codimension %d of %d at %C",
295 ar->codimen + 1, corank);
296 return MATCH_ERROR;
297 }
298
299 if (ar->codimen >= corank)
300 {
301 gfc_error ("Invalid codimension %d at %C, only %d codimensions exist",
302 ar->codimen + 1, corank);
303 return MATCH_ERROR;
304 }
305 }
306
307 gfc_error ("Array reference at %C cannot have more than %d dimensions",
308 GFC_MAX_DIMENSIONS);
309 return MATCH_ERROR;
310
311 }
312
313
314 /************** Array specification matching subroutines ***************/
315
316 /* Free all of the expressions associated with array bounds
317 specifications. */
318
319 void
320 gfc_free_array_spec (gfc_array_spec *as)
321 {
322 int i;
323
324 if (as == NULL)
325 return;
326
327 for (i = 0; i < as->rank + as->corank; i++)
328 {
329 gfc_free_expr (as->lower[i]);
330 gfc_free_expr (as->upper[i]);
331 }
332
333 free (as);
334 }
335
336
337 /* Take an array bound, resolves the expression, that make up the
338 shape and check associated constraints. */
339
340 static bool
341 resolve_array_bound (gfc_expr *e, int check_constant)
342 {
343 if (e == NULL)
344 return true;
345
346 if (!gfc_resolve_expr (e)
347 || !gfc_specification_expr (e))
348 return false;
349
350 if (check_constant && !gfc_is_constant_expr (e))
351 {
352 if (e->expr_type == EXPR_VARIABLE)
353 gfc_error ("Variable %qs at %L in this context must be constant",
354 e->symtree->n.sym->name, &e->where);
355 else
356 gfc_error ("Expression at %L in this context must be constant",
357 &e->where);
358 return false;
359 }
360
361 return true;
362 }
363
364
365 /* Takes an array specification, resolves the expressions that make up
366 the shape and make sure everything is integral. */
367
368 bool
369 gfc_resolve_array_spec (gfc_array_spec *as, int check_constant)
370 {
371 gfc_expr *e;
372 int i;
373
374 if (as == NULL)
375 return true;
376
377 if (as->resolved)
378 return true;
379
380 for (i = 0; i < as->rank + as->corank; i++)
381 {
382 e = as->lower[i];
383 if (!resolve_array_bound (e, check_constant))
384 return false;
385
386 e = as->upper[i];
387 if (!resolve_array_bound (e, check_constant))
388 return false;
389
390 if ((as->lower[i] == NULL) || (as->upper[i] == NULL))
391 continue;
392
393 /* If the size is negative in this dimension, set it to zero. */
394 if (as->lower[i]->expr_type == EXPR_CONSTANT
395 && as->upper[i]->expr_type == EXPR_CONSTANT
396 && mpz_cmp (as->upper[i]->value.integer,
397 as->lower[i]->value.integer) < 0)
398 {
399 gfc_free_expr (as->upper[i]);
400 as->upper[i] = gfc_copy_expr (as->lower[i]);
401 mpz_sub_ui (as->upper[i]->value.integer,
402 as->upper[i]->value.integer, 1);
403 }
404 }
405
406 as->resolved = true;
407
408 return true;
409 }
410
411
412 /* Match a single array element specification. The return values as
413 well as the upper and lower bounds of the array spec are filled
414 in according to what we see on the input. The caller makes sure
415 individual specifications make sense as a whole.
416
417
418 Parsed Lower Upper Returned
419 ------------------------------------
420 : NULL NULL AS_DEFERRED (*)
421 x 1 x AS_EXPLICIT
422 x: x NULL AS_ASSUMED_SHAPE
423 x:y x y AS_EXPLICIT
424 x:* x NULL AS_ASSUMED_SIZE
425 * 1 NULL AS_ASSUMED_SIZE
426
427 (*) For non-pointer dummy arrays this is AS_ASSUMED_SHAPE. This
428 is fixed during the resolution of formal interfaces.
429
430 Anything else AS_UNKNOWN. */
431
432 static array_type
433 match_array_element_spec (gfc_array_spec *as)
434 {
435 gfc_expr **upper, **lower;
436 match m;
437 int rank;
438
439 rank = as->rank == -1 ? 0 : as->rank;
440 lower = &as->lower[rank + as->corank - 1];
441 upper = &as->upper[rank + as->corank - 1];
442
443 if (gfc_match_char ('*') == MATCH_YES)
444 {
445 *lower = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
446 return AS_ASSUMED_SIZE;
447 }
448
449 if (gfc_match_char (':') == MATCH_YES)
450 return AS_DEFERRED;
451
452 m = gfc_match_expr (upper);
453 if (m == MATCH_NO)
454 gfc_error ("Expected expression in array specification at %C");
455 if (m != MATCH_YES)
456 return AS_UNKNOWN;
457 if (!gfc_expr_check_typed (*upper, gfc_current_ns, false))
458 return AS_UNKNOWN;
459
460 if (((*upper)->expr_type == EXPR_CONSTANT
461 && (*upper)->ts.type != BT_INTEGER) ||
462 ((*upper)->expr_type == EXPR_FUNCTION
463 && (*upper)->ts.type == BT_UNKNOWN
464 && (*upper)->symtree
465 && strcmp ((*upper)->symtree->name, "null") == 0))
466 {
467 gfc_error ("Expecting a scalar INTEGER expression at %C, found %s",
468 gfc_basic_typename ((*upper)->ts.type));
469 return AS_UNKNOWN;
470 }
471
472 if (gfc_match_char (':') == MATCH_NO)
473 {
474 *lower = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
475 return AS_EXPLICIT;
476 }
477
478 *lower = *upper;
479 *upper = NULL;
480
481 if (gfc_match_char ('*') == MATCH_YES)
482 return AS_ASSUMED_SIZE;
483
484 m = gfc_match_expr (upper);
485 if (m == MATCH_ERROR)
486 return AS_UNKNOWN;
487 if (m == MATCH_NO)
488 return AS_ASSUMED_SHAPE;
489 if (!gfc_expr_check_typed (*upper, gfc_current_ns, false))
490 return AS_UNKNOWN;
491
492 if (((*upper)->expr_type == EXPR_CONSTANT
493 && (*upper)->ts.type != BT_INTEGER) ||
494 ((*upper)->expr_type == EXPR_FUNCTION
495 && (*upper)->ts.type == BT_UNKNOWN
496 && (*upper)->symtree
497 && strcmp ((*upper)->symtree->name, "null") == 0))
498 {
499 gfc_error ("Expecting a scalar INTEGER expression at %C, found %s",
500 gfc_basic_typename ((*upper)->ts.type));
501 return AS_UNKNOWN;
502 }
503
504 return AS_EXPLICIT;
505 }
506
507
508 /* Matches an array specification, incidentally figuring out what sort
509 it is. Match either a normal array specification, or a coarray spec
510 or both. Optionally allow [:] for coarrays. */
511
512 match
513 gfc_match_array_spec (gfc_array_spec **asp, bool match_dim, bool match_codim)
514 {
515 array_type current_type;
516 gfc_array_spec *as;
517 int i;
518
519 as = gfc_get_array_spec ();
520
521 if (!match_dim)
522 goto coarray;
523
524 if (gfc_match_char ('(') != MATCH_YES)
525 {
526 if (!match_codim)
527 goto done;
528 goto coarray;
529 }
530
531 if (gfc_match (" .. )") == MATCH_YES)
532 {
533 as->type = AS_ASSUMED_RANK;
534 as->rank = -1;
535
536 if (!gfc_notify_std (GFC_STD_F2008_TS, "Assumed-rank array at %C"))
537 goto cleanup;
538
539 if (!match_codim)
540 goto done;
541 goto coarray;
542 }
543
544 for (;;)
545 {
546 as->rank++;
547 current_type = match_array_element_spec (as);
548
549 /* Note that current_type == AS_ASSUMED_SIZE for both assumed-size
550 and implied-shape specifications. If the rank is at least 2, we can
551 distinguish between them. But for rank 1, we currently return
552 ASSUMED_SIZE; this gets adjusted later when we know for sure
553 whether the symbol parsed is a PARAMETER or not. */
554
555 if (as->rank == 1)
556 {
557 if (current_type == AS_UNKNOWN)
558 goto cleanup;
559 as->type = current_type;
560 }
561 else
562 switch (as->type)
563 { /* See how current spec meshes with the existing. */
564 case AS_UNKNOWN:
565 goto cleanup;
566
567 case AS_IMPLIED_SHAPE:
568 if (current_type != AS_ASSUMED_SHAPE)
569 {
570 gfc_error ("Bad array specification for implied-shape"
571 " array at %C");
572 goto cleanup;
573 }
574 break;
575
576 case AS_EXPLICIT:
577 if (current_type == AS_ASSUMED_SIZE)
578 {
579 as->type = AS_ASSUMED_SIZE;
580 break;
581 }
582
583 if (current_type == AS_EXPLICIT)
584 break;
585
586 gfc_error ("Bad array specification for an explicitly shaped "
587 "array at %C");
588
589 goto cleanup;
590
591 case AS_ASSUMED_SHAPE:
592 if ((current_type == AS_ASSUMED_SHAPE)
593 || (current_type == AS_DEFERRED))
594 break;
595
596 gfc_error ("Bad array specification for assumed shape "
597 "array at %C");
598 goto cleanup;
599
600 case AS_DEFERRED:
601 if (current_type == AS_DEFERRED)
602 break;
603
604 if (current_type == AS_ASSUMED_SHAPE)
605 {
606 as->type = AS_ASSUMED_SHAPE;
607 break;
608 }
609
610 gfc_error ("Bad specification for deferred shape array at %C");
611 goto cleanup;
612
613 case AS_ASSUMED_SIZE:
614 if (as->rank == 2 && current_type == AS_ASSUMED_SIZE)
615 {
616 as->type = AS_IMPLIED_SHAPE;
617 break;
618 }
619
620 gfc_error ("Bad specification for assumed size array at %C");
621 goto cleanup;
622
623 case AS_ASSUMED_RANK:
624 gcc_unreachable ();
625 }
626
627 if (gfc_match_char (')') == MATCH_YES)
628 break;
629
630 if (gfc_match_char (',') != MATCH_YES)
631 {
632 gfc_error ("Expected another dimension in array declaration at %C");
633 goto cleanup;
634 }
635
636 if (as->rank + as->corank >= GFC_MAX_DIMENSIONS)
637 {
638 gfc_error ("Array specification at %C has more than %d dimensions",
639 GFC_MAX_DIMENSIONS);
640 goto cleanup;
641 }
642
643 if (as->corank + as->rank >= 7
644 && !gfc_notify_std (GFC_STD_F2008, "Array specification at %C "
645 "with more than 7 dimensions"))
646 goto cleanup;
647 }
648
649 if (!match_codim)
650 goto done;
651
652 coarray:
653 if (gfc_match_char ('[') != MATCH_YES)
654 goto done;
655
656 if (!gfc_notify_std (GFC_STD_F2008, "Coarray declaration at %C"))
657 goto cleanup;
658
659 if (flag_coarray == GFC_FCOARRAY_NONE)
660 {
661 gfc_fatal_error ("Coarrays disabled at %C, use %<-fcoarray=%> to enable");
662 goto cleanup;
663 }
664
665 if (as->rank >= GFC_MAX_DIMENSIONS)
666 {
667 gfc_error ("Array specification at %C has more than %d "
668 "dimensions", GFC_MAX_DIMENSIONS);
669 goto cleanup;
670 }
671
672 for (;;)
673 {
674 as->corank++;
675 current_type = match_array_element_spec (as);
676
677 if (current_type == AS_UNKNOWN)
678 goto cleanup;
679
680 if (as->corank == 1)
681 as->cotype = current_type;
682 else
683 switch (as->cotype)
684 { /* See how current spec meshes with the existing. */
685 case AS_IMPLIED_SHAPE:
686 case AS_UNKNOWN:
687 goto cleanup;
688
689 case AS_EXPLICIT:
690 if (current_type == AS_ASSUMED_SIZE)
691 {
692 as->cotype = AS_ASSUMED_SIZE;
693 break;
694 }
695
696 if (current_type == AS_EXPLICIT)
697 break;
698
699 gfc_error ("Bad array specification for an explicitly "
700 "shaped array at %C");
701
702 goto cleanup;
703
704 case AS_ASSUMED_SHAPE:
705 if ((current_type == AS_ASSUMED_SHAPE)
706 || (current_type == AS_DEFERRED))
707 break;
708
709 gfc_error ("Bad array specification for assumed shape "
710 "array at %C");
711 goto cleanup;
712
713 case AS_DEFERRED:
714 if (current_type == AS_DEFERRED)
715 break;
716
717 if (current_type == AS_ASSUMED_SHAPE)
718 {
719 as->cotype = AS_ASSUMED_SHAPE;
720 break;
721 }
722
723 gfc_error ("Bad specification for deferred shape array at %C");
724 goto cleanup;
725
726 case AS_ASSUMED_SIZE:
727 gfc_error ("Bad specification for assumed size array at %C");
728 goto cleanup;
729
730 case AS_ASSUMED_RANK:
731 gcc_unreachable ();
732 }
733
734 if (gfc_match_char (']') == MATCH_YES)
735 break;
736
737 if (gfc_match_char (',') != MATCH_YES)
738 {
739 gfc_error ("Expected another dimension in array declaration at %C");
740 goto cleanup;
741 }
742
743 if (as->rank + as->corank >= GFC_MAX_DIMENSIONS)
744 {
745 gfc_error ("Array specification at %C has more than %d "
746 "dimensions", GFC_MAX_DIMENSIONS);
747 goto cleanup;
748 }
749 }
750
751 if (current_type == AS_EXPLICIT)
752 {
753 gfc_error ("Upper bound of last coarray dimension must be %<*%> at %C");
754 goto cleanup;
755 }
756
757 if (as->cotype == AS_ASSUMED_SIZE)
758 as->cotype = AS_EXPLICIT;
759
760 if (as->rank == 0)
761 as->type = as->cotype;
762
763 done:
764 if (as->rank == 0 && as->corank == 0)
765 {
766 *asp = NULL;
767 gfc_free_array_spec (as);
768 return MATCH_NO;
769 }
770
771 /* If a lower bounds of an assumed shape array is blank, put in one. */
772 if (as->type == AS_ASSUMED_SHAPE)
773 {
774 for (i = 0; i < as->rank + as->corank; i++)
775 {
776 if (as->lower[i] == NULL)
777 as->lower[i] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
778 }
779 }
780
781 *asp = as;
782
783 return MATCH_YES;
784
785 cleanup:
786 /* Something went wrong. */
787 gfc_free_array_spec (as);
788 return MATCH_ERROR;
789 }
790
791
792 /* Given a symbol and an array specification, modify the symbol to
793 have that array specification. The error locus is needed in case
794 something goes wrong. On failure, the caller must free the spec. */
795
796 bool
797 gfc_set_array_spec (gfc_symbol *sym, gfc_array_spec *as, locus *error_loc)
798 {
799 int i;
800
801 if (as == NULL)
802 return true;
803
804 if (as->rank
805 && !gfc_add_dimension (&sym->attr, sym->name, error_loc))
806 return false;
807
808 if (as->corank
809 && !gfc_add_codimension (&sym->attr, sym->name, error_loc))
810 return false;
811
812 if (sym->as == NULL)
813 {
814 sym->as = as;
815 return true;
816 }
817
818 if ((sym->as->type == AS_ASSUMED_RANK && as->corank)
819 || (as->type == AS_ASSUMED_RANK && sym->as->corank))
820 {
821 gfc_error ("The assumed-rank array %qs at %L shall not have a "
822 "codimension", sym->name, error_loc);
823 return false;
824 }
825
826 if (as->corank)
827 {
828 /* The "sym" has no corank (checked via gfc_add_codimension). Thus
829 the codimension is simply added. */
830 gcc_assert (as->rank == 0 && sym->as->corank == 0);
831
832 sym->as->cotype = as->cotype;
833 sym->as->corank = as->corank;
834 for (i = 0; i < as->corank; i++)
835 {
836 sym->as->lower[sym->as->rank + i] = as->lower[i];
837 sym->as->upper[sym->as->rank + i] = as->upper[i];
838 }
839 }
840 else
841 {
842 /* The "sym" has no rank (checked via gfc_add_dimension). Thus
843 the dimension is added - but first the codimensions (if existing
844 need to be shifted to make space for the dimension. */
845 gcc_assert (as->corank == 0 && sym->as->rank == 0);
846
847 sym->as->rank = as->rank;
848 sym->as->type = as->type;
849 sym->as->cray_pointee = as->cray_pointee;
850 sym->as->cp_was_assumed = as->cp_was_assumed;
851
852 for (i = 0; i < sym->as->corank; i++)
853 {
854 sym->as->lower[as->rank + i] = sym->as->lower[i];
855 sym->as->upper[as->rank + i] = sym->as->upper[i];
856 }
857 for (i = 0; i < as->rank; i++)
858 {
859 sym->as->lower[i] = as->lower[i];
860 sym->as->upper[i] = as->upper[i];
861 }
862 }
863
864 free (as);
865 return true;
866 }
867
868
869 /* Copy an array specification. */
870
871 gfc_array_spec *
872 gfc_copy_array_spec (gfc_array_spec *src)
873 {
874 gfc_array_spec *dest;
875 int i;
876
877 if (src == NULL)
878 return NULL;
879
880 dest = gfc_get_array_spec ();
881
882 *dest = *src;
883
884 for (i = 0; i < dest->rank + dest->corank; i++)
885 {
886 dest->lower[i] = gfc_copy_expr (dest->lower[i]);
887 dest->upper[i] = gfc_copy_expr (dest->upper[i]);
888 }
889
890 return dest;
891 }
892
893
894 /* Returns nonzero if the two expressions are equal. Only handles integer
895 constants. */
896
897 static int
898 compare_bounds (gfc_expr *bound1, gfc_expr *bound2)
899 {
900 if (bound1 == NULL || bound2 == NULL
901 || bound1->expr_type != EXPR_CONSTANT
902 || bound2->expr_type != EXPR_CONSTANT
903 || bound1->ts.type != BT_INTEGER
904 || bound2->ts.type != BT_INTEGER)
905 gfc_internal_error ("gfc_compare_array_spec(): Array spec clobbered");
906
907 if (mpz_cmp (bound1->value.integer, bound2->value.integer) == 0)
908 return 1;
909 else
910 return 0;
911 }
912
913
914 /* Compares two array specifications. They must be constant or deferred
915 shape. */
916
917 int
918 gfc_compare_array_spec (gfc_array_spec *as1, gfc_array_spec *as2)
919 {
920 int i;
921
922 if (as1 == NULL && as2 == NULL)
923 return 1;
924
925 if (as1 == NULL || as2 == NULL)
926 return 0;
927
928 if (as1->rank != as2->rank)
929 return 0;
930
931 if (as1->corank != as2->corank)
932 return 0;
933
934 if (as1->rank == 0)
935 return 1;
936
937 if (as1->type != as2->type)
938 return 0;
939
940 if (as1->type == AS_EXPLICIT)
941 for (i = 0; i < as1->rank + as1->corank; i++)
942 {
943 if (compare_bounds (as1->lower[i], as2->lower[i]) == 0)
944 return 0;
945
946 if (compare_bounds (as1->upper[i], as2->upper[i]) == 0)
947 return 0;
948 }
949
950 return 1;
951 }
952
953
954 /****************** Array constructor functions ******************/
955
956
957 /* Given an expression node that might be an array constructor and a
958 symbol, make sure that no iterators in this or child constructors
959 use the symbol as an implied-DO iterator. Returns nonzero if a
960 duplicate was found. */
961
962 static int
963 check_duplicate_iterator (gfc_constructor_base base, gfc_symbol *master)
964 {
965 gfc_constructor *c;
966 gfc_expr *e;
967
968 for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
969 {
970 e = c->expr;
971
972 if (e->expr_type == EXPR_ARRAY
973 && check_duplicate_iterator (e->value.constructor, master))
974 return 1;
975
976 if (c->iterator == NULL)
977 continue;
978
979 if (c->iterator->var->symtree->n.sym == master)
980 {
981 gfc_error ("DO-iterator %qs at %L is inside iterator of the "
982 "same name", master->name, &c->where);
983
984 return 1;
985 }
986 }
987
988 return 0;
989 }
990
991
992 /* Forward declaration because these functions are mutually recursive. */
993 static match match_array_cons_element (gfc_constructor_base *);
994
995 /* Match a list of array elements. */
996
997 static match
998 match_array_list (gfc_constructor_base *result)
999 {
1000 gfc_constructor_base head;
1001 gfc_constructor *p;
1002 gfc_iterator iter;
1003 locus old_loc;
1004 gfc_expr *e;
1005 match m;
1006 int n;
1007
1008 old_loc = gfc_current_locus;
1009
1010 if (gfc_match_char ('(') == MATCH_NO)
1011 return MATCH_NO;
1012
1013 memset (&iter, '\0', sizeof (gfc_iterator));
1014 head = NULL;
1015
1016 m = match_array_cons_element (&head);
1017 if (m != MATCH_YES)
1018 goto cleanup;
1019
1020 if (gfc_match_char (',') != MATCH_YES)
1021 {
1022 m = MATCH_NO;
1023 goto cleanup;
1024 }
1025
1026 for (n = 1;; n++)
1027 {
1028 m = gfc_match_iterator (&iter, 0);
1029 if (m == MATCH_YES)
1030 break;
1031 if (m == MATCH_ERROR)
1032 goto cleanup;
1033
1034 m = match_array_cons_element (&head);
1035 if (m == MATCH_ERROR)
1036 goto cleanup;
1037 if (m == MATCH_NO)
1038 {
1039 if (n > 2)
1040 goto syntax;
1041 m = MATCH_NO;
1042 goto cleanup; /* Could be a complex constant */
1043 }
1044
1045 if (gfc_match_char (',') != MATCH_YES)
1046 {
1047 if (n > 2)
1048 goto syntax;
1049 m = MATCH_NO;
1050 goto cleanup;
1051 }
1052 }
1053
1054 if (gfc_match_char (')') != MATCH_YES)
1055 goto syntax;
1056
1057 if (check_duplicate_iterator (head, iter.var->symtree->n.sym))
1058 {
1059 m = MATCH_ERROR;
1060 goto cleanup;
1061 }
1062
1063 e = gfc_get_array_expr (BT_UNKNOWN, 0, &old_loc);
1064 e->value.constructor = head;
1065
1066 p = gfc_constructor_append_expr (result, e, &gfc_current_locus);
1067 p->iterator = gfc_get_iterator ();
1068 *p->iterator = iter;
1069
1070 return MATCH_YES;
1071
1072 syntax:
1073 gfc_error ("Syntax error in array constructor at %C");
1074 m = MATCH_ERROR;
1075
1076 cleanup:
1077 gfc_constructor_free (head);
1078 gfc_free_iterator (&iter, 0);
1079 gfc_current_locus = old_loc;
1080 return m;
1081 }
1082
1083
1084 /* Match a single element of an array constructor, which can be a
1085 single expression or a list of elements. */
1086
1087 static match
1088 match_array_cons_element (gfc_constructor_base *result)
1089 {
1090 gfc_expr *expr;
1091 match m;
1092
1093 m = match_array_list (result);
1094 if (m != MATCH_NO)
1095 return m;
1096
1097 m = gfc_match_expr (&expr);
1098 if (m != MATCH_YES)
1099 return m;
1100
1101 gfc_constructor_append_expr (result, expr, &gfc_current_locus);
1102 return MATCH_YES;
1103 }
1104
1105
1106 /* Match an array constructor. */
1107
1108 match
1109 gfc_match_array_constructor (gfc_expr **result)
1110 {
1111 gfc_constructor *c;
1112 gfc_constructor_base head;
1113 gfc_expr *expr;
1114 gfc_typespec ts;
1115 locus where;
1116 match m;
1117 const char *end_delim;
1118 bool seen_ts;
1119
1120 head = NULL;
1121 seen_ts = false;
1122
1123 if (gfc_match (" (/") == MATCH_NO)
1124 {
1125 if (gfc_match (" [") == MATCH_NO)
1126 return MATCH_NO;
1127 else
1128 {
1129 if (!gfc_notify_std (GFC_STD_F2003, "[...] "
1130 "style array constructors at %C"))
1131 return MATCH_ERROR;
1132 end_delim = " ]";
1133 }
1134 }
1135 else
1136 end_delim = " /)";
1137
1138 where = gfc_current_locus;
1139
1140 /* Try to match an optional "type-spec ::" */
1141 gfc_clear_ts (&ts);
1142 m = gfc_match_type_spec (&ts);
1143 if (m == MATCH_YES)
1144 {
1145 seen_ts = (gfc_match (" ::") == MATCH_YES);
1146
1147 if (seen_ts)
1148 {
1149 if (!gfc_notify_std (GFC_STD_F2003, "Array constructor "
1150 "including type specification at %C"))
1151 goto cleanup;
1152
1153 if (ts.deferred)
1154 {
1155 gfc_error ("Type-spec at %L cannot contain a deferred "
1156 "type parameter", &where);
1157 goto cleanup;
1158 }
1159
1160 if (ts.type == BT_CHARACTER
1161 && ts.u.cl && !ts.u.cl->length && !ts.u.cl->length_from_typespec)
1162 {
1163 gfc_error ("Type-spec at %L cannot contain an asterisk for a "
1164 "type parameter", &where);
1165 goto cleanup;
1166 }
1167 }
1168 }
1169 else if (m == MATCH_ERROR)
1170 goto cleanup;
1171
1172 if (!seen_ts)
1173 gfc_current_locus = where;
1174
1175 if (gfc_match (end_delim) == MATCH_YES)
1176 {
1177 if (seen_ts)
1178 goto done;
1179 else
1180 {
1181 gfc_error ("Empty array constructor at %C is not allowed");
1182 goto cleanup;
1183 }
1184 }
1185
1186 for (;;)
1187 {
1188 m = match_array_cons_element (&head);
1189 if (m == MATCH_ERROR)
1190 goto cleanup;
1191 if (m == MATCH_NO)
1192 goto syntax;
1193
1194 if (gfc_match_char (',') == MATCH_NO)
1195 break;
1196 }
1197
1198 if (gfc_match (end_delim) == MATCH_NO)
1199 goto syntax;
1200
1201 done:
1202 /* Size must be calculated at resolution time. */
1203 if (seen_ts)
1204 {
1205 expr = gfc_get_array_expr (ts.type, ts.kind, &where);
1206 expr->ts = ts;
1207
1208 /* If the typespec is CHARACTER, check that array elements can
1209 be converted. See PR fortran/67803. */
1210 if (ts.type == BT_CHARACTER)
1211 {
1212 c = gfc_constructor_first (head);
1213 for (; c; c = gfc_constructor_next (c))
1214 {
1215 if (gfc_numeric_ts (&c->expr->ts)
1216 || c->expr->ts.type == BT_LOGICAL)
1217 {
1218 gfc_error ("Incompatible typespec for array element at %L",
1219 &c->expr->where);
1220 return MATCH_ERROR;
1221 }
1222
1223 /* Special case null(). */
1224 if (c->expr->expr_type == EXPR_FUNCTION
1225 && c->expr->ts.type == BT_UNKNOWN
1226 && strcmp (c->expr->symtree->name, "null") == 0)
1227 {
1228 gfc_error ("Incompatible typespec for array element at %L",
1229 &c->expr->where);
1230 return MATCH_ERROR;
1231 }
1232 }
1233 }
1234
1235 /* Walk the constructor and ensure type conversion for numeric types. */
1236 if (gfc_numeric_ts (&ts))
1237 {
1238 c = gfc_constructor_first (head);
1239 for (; c; c = gfc_constructor_next (c))
1240 gfc_convert_type (c->expr, &ts, 1);
1241 }
1242 }
1243 else
1244 expr = gfc_get_array_expr (BT_UNKNOWN, 0, &where);
1245
1246 expr->value.constructor = head;
1247 if (expr->ts.u.cl)
1248 expr->ts.u.cl->length_from_typespec = seen_ts;
1249
1250 *result = expr;
1251
1252 return MATCH_YES;
1253
1254 syntax:
1255 gfc_error ("Syntax error in array constructor at %C");
1256
1257 cleanup:
1258 gfc_constructor_free (head);
1259 return MATCH_ERROR;
1260 }
1261
1262
1263
1264 /************** Check array constructors for correctness **************/
1265
1266 /* Given an expression, compare it's type with the type of the current
1267 constructor. Returns nonzero if an error was issued. The
1268 cons_state variable keeps track of whether the type of the
1269 constructor being read or resolved is known to be good, bad or just
1270 starting out. */
1271
1272 static gfc_typespec constructor_ts;
1273 static enum
1274 { CONS_START, CONS_GOOD, CONS_BAD }
1275 cons_state;
1276
1277 static int
1278 check_element_type (gfc_expr *expr, bool convert)
1279 {
1280 if (cons_state == CONS_BAD)
1281 return 0; /* Suppress further errors */
1282
1283 if (cons_state == CONS_START)
1284 {
1285 if (expr->ts.type == BT_UNKNOWN)
1286 cons_state = CONS_BAD;
1287 else
1288 {
1289 cons_state = CONS_GOOD;
1290 constructor_ts = expr->ts;
1291 }
1292
1293 return 0;
1294 }
1295
1296 if (gfc_compare_types (&constructor_ts, &expr->ts))
1297 return 0;
1298
1299 if (convert)
1300 return gfc_convert_type(expr, &constructor_ts, 1) ? 0 : 1;
1301
1302 gfc_error ("Element in %s array constructor at %L is %s",
1303 gfc_typename (&constructor_ts), &expr->where,
1304 gfc_typename (&expr->ts));
1305
1306 cons_state = CONS_BAD;
1307 return 1;
1308 }
1309
1310
1311 /* Recursive work function for gfc_check_constructor_type(). */
1312
1313 static bool
1314 check_constructor_type (gfc_constructor_base base, bool convert)
1315 {
1316 gfc_constructor *c;
1317 gfc_expr *e;
1318
1319 for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
1320 {
1321 e = c->expr;
1322
1323 if (e->expr_type == EXPR_ARRAY)
1324 {
1325 if (!check_constructor_type (e->value.constructor, convert))
1326 return false;
1327
1328 continue;
1329 }
1330
1331 if (check_element_type (e, convert))
1332 return false;
1333 }
1334
1335 return true;
1336 }
1337
1338
1339 /* Check that all elements of an array constructor are the same type.
1340 On false, an error has been generated. */
1341
1342 bool
1343 gfc_check_constructor_type (gfc_expr *e)
1344 {
1345 bool t;
1346
1347 if (e->ts.type != BT_UNKNOWN)
1348 {
1349 cons_state = CONS_GOOD;
1350 constructor_ts = e->ts;
1351 }
1352 else
1353 {
1354 cons_state = CONS_START;
1355 gfc_clear_ts (&constructor_ts);
1356 }
1357
1358 /* If e->ts.type != BT_UNKNOWN, the array constructor included a
1359 typespec, and we will now convert the values on the fly. */
1360 t = check_constructor_type (e->value.constructor, e->ts.type != BT_UNKNOWN);
1361 if (t && e->ts.type == BT_UNKNOWN)
1362 e->ts = constructor_ts;
1363
1364 return t;
1365 }
1366
1367
1368
1369 typedef struct cons_stack
1370 {
1371 gfc_iterator *iterator;
1372 struct cons_stack *previous;
1373 }
1374 cons_stack;
1375
1376 static cons_stack *base;
1377
1378 static bool check_constructor (gfc_constructor_base, bool (*) (gfc_expr *));
1379
1380 /* Check an EXPR_VARIABLE expression in a constructor to make sure
1381 that that variable is an iteration variables. */
1382
1383 bool
1384 gfc_check_iter_variable (gfc_expr *expr)
1385 {
1386 gfc_symbol *sym;
1387 cons_stack *c;
1388
1389 sym = expr->symtree->n.sym;
1390
1391 for (c = base; c && c->iterator; c = c->previous)
1392 if (sym == c->iterator->var->symtree->n.sym)
1393 return true;
1394
1395 return false;
1396 }
1397
1398
1399 /* Recursive work function for gfc_check_constructor(). This amounts
1400 to calling the check function for each expression in the
1401 constructor, giving variables with the names of iterators a pass. */
1402
1403 static bool
1404 check_constructor (gfc_constructor_base ctor, bool (*check_function) (gfc_expr *))
1405 {
1406 cons_stack element;
1407 gfc_expr *e;
1408 bool t;
1409 gfc_constructor *c;
1410
1411 for (c = gfc_constructor_first (ctor); c; c = gfc_constructor_next (c))
1412 {
1413 e = c->expr;
1414
1415 if (!e)
1416 continue;
1417
1418 if (e->expr_type != EXPR_ARRAY)
1419 {
1420 if (!(*check_function)(e))
1421 return false;
1422 continue;
1423 }
1424
1425 element.previous = base;
1426 element.iterator = c->iterator;
1427
1428 base = &element;
1429 t = check_constructor (e->value.constructor, check_function);
1430 base = element.previous;
1431
1432 if (!t)
1433 return false;
1434 }
1435
1436 /* Nothing went wrong, so all OK. */
1437 return true;
1438 }
1439
1440
1441 /* Checks a constructor to see if it is a particular kind of
1442 expression -- specification, restricted, or initialization as
1443 determined by the check_function. */
1444
1445 bool
1446 gfc_check_constructor (gfc_expr *expr, bool (*check_function) (gfc_expr *))
1447 {
1448 cons_stack *base_save;
1449 bool t;
1450
1451 base_save = base;
1452 base = NULL;
1453
1454 t = check_constructor (expr->value.constructor, check_function);
1455 base = base_save;
1456
1457 return t;
1458 }
1459
1460
1461
1462 /**************** Simplification of array constructors ****************/
1463
1464 iterator_stack *iter_stack;
1465
1466 typedef struct
1467 {
1468 gfc_constructor_base base;
1469 int extract_count, extract_n;
1470 gfc_expr *extracted;
1471 mpz_t *count;
1472
1473 mpz_t *offset;
1474 gfc_component *component;
1475 mpz_t *repeat;
1476
1477 bool (*expand_work_function) (gfc_expr *);
1478 }
1479 expand_info;
1480
1481 static expand_info current_expand;
1482
1483 static bool expand_constructor (gfc_constructor_base);
1484
1485
1486 /* Work function that counts the number of elements present in a
1487 constructor. */
1488
1489 static bool
1490 count_elements (gfc_expr *e)
1491 {
1492 mpz_t result;
1493
1494 if (e->rank == 0)
1495 mpz_add_ui (*current_expand.count, *current_expand.count, 1);
1496 else
1497 {
1498 if (!gfc_array_size (e, &result))
1499 {
1500 gfc_free_expr (e);
1501 return false;
1502 }
1503
1504 mpz_add (*current_expand.count, *current_expand.count, result);
1505 mpz_clear (result);
1506 }
1507
1508 gfc_free_expr (e);
1509 return true;
1510 }
1511
1512
1513 /* Work function that extracts a particular element from an array
1514 constructor, freeing the rest. */
1515
1516 static bool
1517 extract_element (gfc_expr *e)
1518 {
1519 if (e->rank != 0)
1520 { /* Something unextractable */
1521 gfc_free_expr (e);
1522 return false;
1523 }
1524
1525 if (current_expand.extract_count == current_expand.extract_n)
1526 current_expand.extracted = e;
1527 else
1528 gfc_free_expr (e);
1529
1530 current_expand.extract_count++;
1531
1532 return true;
1533 }
1534
1535
1536 /* Work function that constructs a new constructor out of the old one,
1537 stringing new elements together. */
1538
1539 static bool
1540 expand (gfc_expr *e)
1541 {
1542 gfc_constructor *c = gfc_constructor_append_expr (&current_expand.base,
1543 e, &e->where);
1544
1545 c->n.component = current_expand.component;
1546 return true;
1547 }
1548
1549
1550 /* Given an initialization expression that is a variable reference,
1551 substitute the current value of the iteration variable. */
1552
1553 void
1554 gfc_simplify_iterator_var (gfc_expr *e)
1555 {
1556 iterator_stack *p;
1557
1558 for (p = iter_stack; p; p = p->prev)
1559 if (e->symtree == p->variable)
1560 break;
1561
1562 if (p == NULL)
1563 return; /* Variable not found */
1564
1565 gfc_replace_expr (e, gfc_get_int_expr (gfc_default_integer_kind, NULL, 0));
1566
1567 mpz_set (e->value.integer, p->value);
1568
1569 return;
1570 }
1571
1572
1573 /* Expand an expression with that is inside of a constructor,
1574 recursing into other constructors if present. */
1575
1576 static bool
1577 expand_expr (gfc_expr *e)
1578 {
1579 if (e->expr_type == EXPR_ARRAY)
1580 return expand_constructor (e->value.constructor);
1581
1582 e = gfc_copy_expr (e);
1583
1584 if (!gfc_simplify_expr (e, 1))
1585 {
1586 gfc_free_expr (e);
1587 return false;
1588 }
1589
1590 return current_expand.expand_work_function (e);
1591 }
1592
1593
1594 static bool
1595 expand_iterator (gfc_constructor *c)
1596 {
1597 gfc_expr *start, *end, *step;
1598 iterator_stack frame;
1599 mpz_t trip;
1600 bool t;
1601
1602 end = step = NULL;
1603
1604 t = false;
1605
1606 mpz_init (trip);
1607 mpz_init (frame.value);
1608 frame.prev = NULL;
1609
1610 start = gfc_copy_expr (c->iterator->start);
1611 if (!gfc_simplify_expr (start, 1))
1612 goto cleanup;
1613
1614 if (start->expr_type != EXPR_CONSTANT || start->ts.type != BT_INTEGER)
1615 goto cleanup;
1616
1617 end = gfc_copy_expr (c->iterator->end);
1618 if (!gfc_simplify_expr (end, 1))
1619 goto cleanup;
1620
1621 if (end->expr_type != EXPR_CONSTANT || end->ts.type != BT_INTEGER)
1622 goto cleanup;
1623
1624 step = gfc_copy_expr (c->iterator->step);
1625 if (!gfc_simplify_expr (step, 1))
1626 goto cleanup;
1627
1628 if (step->expr_type != EXPR_CONSTANT || step->ts.type != BT_INTEGER)
1629 goto cleanup;
1630
1631 if (mpz_sgn (step->value.integer) == 0)
1632 {
1633 gfc_error ("Iterator step at %L cannot be zero", &step->where);
1634 goto cleanup;
1635 }
1636
1637 /* Calculate the trip count of the loop. */
1638 mpz_sub (trip, end->value.integer, start->value.integer);
1639 mpz_add (trip, trip, step->value.integer);
1640 mpz_tdiv_q (trip, trip, step->value.integer);
1641
1642 mpz_set (frame.value, start->value.integer);
1643
1644 frame.prev = iter_stack;
1645 frame.variable = c->iterator->var->symtree;
1646 iter_stack = &frame;
1647
1648 while (mpz_sgn (trip) > 0)
1649 {
1650 if (!expand_expr (c->expr))
1651 goto cleanup;
1652
1653 mpz_add (frame.value, frame.value, step->value.integer);
1654 mpz_sub_ui (trip, trip, 1);
1655 }
1656
1657 t = true;
1658
1659 cleanup:
1660 gfc_free_expr (start);
1661 gfc_free_expr (end);
1662 gfc_free_expr (step);
1663
1664 mpz_clear (trip);
1665 mpz_clear (frame.value);
1666
1667 iter_stack = frame.prev;
1668
1669 return t;
1670 }
1671
1672
1673 /* Expand a constructor into constant constructors without any
1674 iterators, calling the work function for each of the expanded
1675 expressions. The work function needs to either save or free the
1676 passed expression. */
1677
1678 static bool
1679 expand_constructor (gfc_constructor_base base)
1680 {
1681 gfc_constructor *c;
1682 gfc_expr *e;
1683
1684 for (c = gfc_constructor_first (base); c; c = gfc_constructor_next(c))
1685 {
1686 if (c->iterator != NULL)
1687 {
1688 if (!expand_iterator (c))
1689 return false;
1690 continue;
1691 }
1692
1693 e = c->expr;
1694
1695 if (e->expr_type == EXPR_ARRAY)
1696 {
1697 if (!expand_constructor (e->value.constructor))
1698 return false;
1699
1700 continue;
1701 }
1702
1703 e = gfc_copy_expr (e);
1704 if (!gfc_simplify_expr (e, 1))
1705 {
1706 gfc_free_expr (e);
1707 return false;
1708 }
1709 current_expand.offset = &c->offset;
1710 current_expand.repeat = &c->repeat;
1711 current_expand.component = c->n.component;
1712 if (!current_expand.expand_work_function(e))
1713 return false;
1714 }
1715 return true;
1716 }
1717
1718
1719 /* Given an array expression and an element number (starting at zero),
1720 return a pointer to the array element. NULL is returned if the
1721 size of the array has been exceeded. The expression node returned
1722 remains a part of the array and should not be freed. Access is not
1723 efficient at all, but this is another place where things do not
1724 have to be particularly fast. */
1725
1726 static gfc_expr *
1727 gfc_get_array_element (gfc_expr *array, int element)
1728 {
1729 expand_info expand_save;
1730 gfc_expr *e;
1731 bool rc;
1732
1733 expand_save = current_expand;
1734 current_expand.extract_n = element;
1735 current_expand.expand_work_function = extract_element;
1736 current_expand.extracted = NULL;
1737 current_expand.extract_count = 0;
1738
1739 iter_stack = NULL;
1740
1741 rc = expand_constructor (array->value.constructor);
1742 e = current_expand.extracted;
1743 current_expand = expand_save;
1744
1745 if (!rc)
1746 return NULL;
1747
1748 return e;
1749 }
1750
1751
1752 /* Top level subroutine for expanding constructors. We only expand
1753 constructor if they are small enough. */
1754
1755 bool
1756 gfc_expand_constructor (gfc_expr *e, bool fatal)
1757 {
1758 expand_info expand_save;
1759 gfc_expr *f;
1760 bool rc;
1761
1762 /* If we can successfully get an array element at the max array size then
1763 the array is too big to expand, so we just return. */
1764 f = gfc_get_array_element (e, flag_max_array_constructor);
1765 if (f != NULL)
1766 {
1767 gfc_free_expr (f);
1768 if (fatal)
1769 {
1770 gfc_error ("The number of elements in the array constructor "
1771 "at %L requires an increase of the allowed %d "
1772 "upper limit. See %<-fmax-array-constructor%> "
1773 "option", &e->where, flag_max_array_constructor);
1774 return false;
1775 }
1776 return true;
1777 }
1778
1779 /* We now know the array is not too big so go ahead and try to expand it. */
1780 expand_save = current_expand;
1781 current_expand.base = NULL;
1782
1783 iter_stack = NULL;
1784
1785 current_expand.expand_work_function = expand;
1786
1787 if (!expand_constructor (e->value.constructor))
1788 {
1789 gfc_constructor_free (current_expand.base);
1790 rc = false;
1791 goto done;
1792 }
1793
1794 gfc_constructor_free (e->value.constructor);
1795 e->value.constructor = current_expand.base;
1796
1797 rc = true;
1798
1799 done:
1800 current_expand = expand_save;
1801
1802 return rc;
1803 }
1804
1805
1806 /* Work function for checking that an element of a constructor is a
1807 constant, after removal of any iteration variables. We return
1808 false if not so. */
1809
1810 static bool
1811 is_constant_element (gfc_expr *e)
1812 {
1813 int rv;
1814
1815 rv = gfc_is_constant_expr (e);
1816 gfc_free_expr (e);
1817
1818 return rv ? true : false;
1819 }
1820
1821
1822 /* Given an array constructor, determine if the constructor is
1823 constant or not by expanding it and making sure that all elements
1824 are constants. This is a bit of a hack since something like (/ (i,
1825 i=1,100000000) /) will take a while as* opposed to a more clever
1826 function that traverses the expression tree. FIXME. */
1827
1828 int
1829 gfc_constant_ac (gfc_expr *e)
1830 {
1831 expand_info expand_save;
1832 bool rc;
1833
1834 iter_stack = NULL;
1835 expand_save = current_expand;
1836 current_expand.expand_work_function = is_constant_element;
1837
1838 rc = expand_constructor (e->value.constructor);
1839
1840 current_expand = expand_save;
1841 if (!rc)
1842 return 0;
1843
1844 return 1;
1845 }
1846
1847
1848 /* Returns nonzero if an array constructor has been completely
1849 expanded (no iterators) and zero if iterators are present. */
1850
1851 int
1852 gfc_expanded_ac (gfc_expr *e)
1853 {
1854 gfc_constructor *c;
1855
1856 if (e->expr_type == EXPR_ARRAY)
1857 for (c = gfc_constructor_first (e->value.constructor);
1858 c; c = gfc_constructor_next (c))
1859 if (c->iterator != NULL || !gfc_expanded_ac (c->expr))
1860 return 0;
1861
1862 return 1;
1863 }
1864
1865
1866 /*************** Type resolution of array constructors ***************/
1867
1868
1869 /* The symbol expr_is_sought_symbol_ref will try to find. */
1870 static const gfc_symbol *sought_symbol = NULL;
1871
1872
1873 /* Tells whether the expression E is a variable reference to the symbol
1874 in the static variable SOUGHT_SYMBOL, and sets the locus pointer WHERE
1875 accordingly.
1876 To be used with gfc_expr_walker: if a reference is found we don't need
1877 to look further so we return 1 to skip any further walk. */
1878
1879 static int
1880 expr_is_sought_symbol_ref (gfc_expr **e, int *walk_subtrees ATTRIBUTE_UNUSED,
1881 void *where)
1882 {
1883 gfc_expr *expr = *e;
1884 locus *sym_loc = (locus *)where;
1885
1886 if (expr->expr_type == EXPR_VARIABLE
1887 && expr->symtree->n.sym == sought_symbol)
1888 {
1889 *sym_loc = expr->where;
1890 return 1;
1891 }
1892
1893 return 0;
1894 }
1895
1896
1897 /* Tells whether the expression EXPR contains a reference to the symbol
1898 SYM and in that case sets the position SYM_LOC where the reference is. */
1899
1900 static bool
1901 find_symbol_in_expr (gfc_symbol *sym, gfc_expr *expr, locus *sym_loc)
1902 {
1903 int ret;
1904
1905 sought_symbol = sym;
1906 ret = gfc_expr_walker (&expr, &expr_is_sought_symbol_ref, sym_loc);
1907 sought_symbol = NULL;
1908 return ret;
1909 }
1910
1911
1912 /* Recursive array list resolution function. All of the elements must
1913 be of the same type. */
1914
1915 static bool
1916 resolve_array_list (gfc_constructor_base base)
1917 {
1918 bool t;
1919 gfc_constructor *c;
1920 gfc_iterator *iter;
1921
1922 t = true;
1923
1924 for (c = gfc_constructor_first (base); c; c = gfc_constructor_next (c))
1925 {
1926 iter = c->iterator;
1927 if (iter != NULL)
1928 {
1929 gfc_symbol *iter_var;
1930 locus iter_var_loc;
1931
1932 if (!gfc_resolve_iterator (iter, false, true))
1933 t = false;
1934
1935 /* Check for bounds referencing the iterator variable. */
1936 gcc_assert (iter->var->expr_type == EXPR_VARIABLE);
1937 iter_var = iter->var->symtree->n.sym;
1938 if (find_symbol_in_expr (iter_var, iter->start, &iter_var_loc))
1939 {
1940 if (!gfc_notify_std (GFC_STD_LEGACY, "AC-IMPLIED-DO initial "
1941 "expression references control variable "
1942 "at %L", &iter_var_loc))
1943 t = false;
1944 }
1945 if (find_symbol_in_expr (iter_var, iter->end, &iter_var_loc))
1946 {
1947 if (!gfc_notify_std (GFC_STD_LEGACY, "AC-IMPLIED-DO final "
1948 "expression references control variable "
1949 "at %L", &iter_var_loc))
1950 t = false;
1951 }
1952 if (find_symbol_in_expr (iter_var, iter->step, &iter_var_loc))
1953 {
1954 if (!gfc_notify_std (GFC_STD_LEGACY, "AC-IMPLIED-DO step "
1955 "expression references control variable "
1956 "at %L", &iter_var_loc))
1957 t = false;
1958 }
1959 }
1960
1961 if (!gfc_resolve_expr (c->expr))
1962 t = false;
1963
1964 if (UNLIMITED_POLY (c->expr))
1965 {
1966 gfc_error ("Array constructor value at %L shall not be unlimited "
1967 "polymorphic [F2008: C4106]", &c->expr->where);
1968 t = false;
1969 }
1970 }
1971
1972 return t;
1973 }
1974
1975 /* Resolve character array constructor. If it has a specified constant character
1976 length, pad/truncate the elements here; if the length is not specified and
1977 all elements are of compile-time known length, emit an error as this is
1978 invalid. */
1979
1980 bool
1981 gfc_resolve_character_array_constructor (gfc_expr *expr)
1982 {
1983 gfc_constructor *p;
1984 HOST_WIDE_INT found_length;
1985
1986 gcc_assert (expr->expr_type == EXPR_ARRAY);
1987 gcc_assert (expr->ts.type == BT_CHARACTER);
1988
1989 if (expr->ts.u.cl == NULL)
1990 {
1991 for (p = gfc_constructor_first (expr->value.constructor);
1992 p; p = gfc_constructor_next (p))
1993 if (p->expr->ts.u.cl != NULL)
1994 {
1995 /* Ensure that if there is a char_len around that it is
1996 used; otherwise the middle-end confuses them! */
1997 expr->ts.u.cl = p->expr->ts.u.cl;
1998 goto got_charlen;
1999 }
2000
2001 expr->ts.u.cl = gfc_new_charlen (gfc_current_ns, NULL);
2002 }
2003
2004 got_charlen:
2005
2006 /* Early exit for zero size arrays. */
2007 if (expr->shape)
2008 {
2009 mpz_t size;
2010 HOST_WIDE_INT arraysize;
2011
2012 gfc_array_size (expr, &size);
2013 arraysize = mpz_get_ui (size);
2014 mpz_clear (size);
2015
2016 if (arraysize == 0)
2017 return true;
2018 }
2019
2020 found_length = -1;
2021
2022 if (expr->ts.u.cl->length == NULL)
2023 {
2024 /* Check that all constant string elements have the same length until
2025 we reach the end or find a variable-length one. */
2026
2027 for (p = gfc_constructor_first (expr->value.constructor);
2028 p; p = gfc_constructor_next (p))
2029 {
2030 HOST_WIDE_INT current_length = -1;
2031 gfc_ref *ref;
2032 for (ref = p->expr->ref; ref; ref = ref->next)
2033 if (ref->type == REF_SUBSTRING
2034 && ref->u.ss.start->expr_type == EXPR_CONSTANT
2035 && ref->u.ss.end->expr_type == EXPR_CONSTANT)
2036 break;
2037
2038 if (p->expr->expr_type == EXPR_CONSTANT)
2039 current_length = p->expr->value.character.length;
2040 else if (ref)
2041 current_length = gfc_mpz_get_hwi (ref->u.ss.end->value.integer)
2042 - gfc_mpz_get_hwi (ref->u.ss.start->value.integer) + 1;
2043 else if (p->expr->ts.u.cl && p->expr->ts.u.cl->length
2044 && p->expr->ts.u.cl->length->expr_type == EXPR_CONSTANT)
2045 current_length = gfc_mpz_get_hwi (p->expr->ts.u.cl->length->value.integer);
2046 else
2047 return true;
2048
2049 if (current_length < 0)
2050 current_length = 0;
2051
2052 if (found_length == -1)
2053 found_length = current_length;
2054 else if (found_length != current_length)
2055 {
2056 gfc_error ("Different CHARACTER lengths (%ld/%ld) in array"
2057 " constructor at %L", (long) found_length,
2058 (long) current_length, &p->expr->where);
2059 return false;
2060 }
2061
2062 gcc_assert (found_length == current_length);
2063 }
2064
2065 gcc_assert (found_length != -1);
2066
2067 /* Update the character length of the array constructor. */
2068 expr->ts.u.cl->length = gfc_get_int_expr (gfc_charlen_int_kind,
2069 NULL, found_length);
2070 }
2071 else
2072 {
2073 /* We've got a character length specified. It should be an integer,
2074 otherwise an error is signalled elsewhere. */
2075 gcc_assert (expr->ts.u.cl->length);
2076
2077 /* If we've got a constant character length, pad according to this.
2078 gfc_extract_int does check for BT_INTEGER and EXPR_CONSTANT and sets
2079 max_length only if they pass. */
2080 gfc_extract_hwi (expr->ts.u.cl->length, &found_length);
2081
2082 /* Now pad/truncate the elements accordingly to the specified character
2083 length. This is ok inside this conditional, as in the case above
2084 (without typespec) all elements are verified to have the same length
2085 anyway. */
2086 if (found_length != -1)
2087 for (p = gfc_constructor_first (expr->value.constructor);
2088 p; p = gfc_constructor_next (p))
2089 if (p->expr->expr_type == EXPR_CONSTANT)
2090 {
2091 gfc_expr *cl = NULL;
2092 HOST_WIDE_INT current_length = -1;
2093 bool has_ts;
2094
2095 if (p->expr->ts.u.cl && p->expr->ts.u.cl->length)
2096 {
2097 cl = p->expr->ts.u.cl->length;
2098 gfc_extract_hwi (cl, &current_length);
2099 }
2100
2101 /* If gfc_extract_int above set current_length, we implicitly
2102 know the type is BT_INTEGER and it's EXPR_CONSTANT. */
2103
2104 has_ts = expr->ts.u.cl->length_from_typespec;
2105
2106 if (! cl
2107 || (current_length != -1 && current_length != found_length))
2108 gfc_set_constant_character_len (found_length, p->expr,
2109 has_ts ? -1 : found_length);
2110 }
2111 }
2112
2113 return true;
2114 }
2115
2116
2117 /* Resolve all of the expressions in an array list. */
2118
2119 bool
2120 gfc_resolve_array_constructor (gfc_expr *expr)
2121 {
2122 bool t;
2123
2124 t = resolve_array_list (expr->value.constructor);
2125 if (t)
2126 t = gfc_check_constructor_type (expr);
2127
2128 /* gfc_resolve_character_array_constructor is called in gfc_resolve_expr after
2129 the call to this function, so we don't need to call it here; if it was
2130 called twice, an error message there would be duplicated. */
2131
2132 return t;
2133 }
2134
2135
2136 /* Copy an iterator structure. */
2137
2138 gfc_iterator *
2139 gfc_copy_iterator (gfc_iterator *src)
2140 {
2141 gfc_iterator *dest;
2142
2143 if (src == NULL)
2144 return NULL;
2145
2146 dest = gfc_get_iterator ();
2147
2148 dest->var = gfc_copy_expr (src->var);
2149 dest->start = gfc_copy_expr (src->start);
2150 dest->end = gfc_copy_expr (src->end);
2151 dest->step = gfc_copy_expr (src->step);
2152 dest->unroll = src->unroll;
2153
2154 return dest;
2155 }
2156
2157
2158 /********* Subroutines for determining the size of an array *********/
2159
2160 /* These are needed just to accommodate RESHAPE(). There are no
2161 diagnostics here, we just return a negative number if something
2162 goes wrong. */
2163
2164
2165 /* Get the size of single dimension of an array specification. The
2166 array is guaranteed to be one dimensional. */
2167
2168 bool
2169 spec_dimen_size (gfc_array_spec *as, int dimen, mpz_t *result)
2170 {
2171 if (as == NULL)
2172 return false;
2173
2174 if (dimen < 0 || dimen > as->rank - 1)
2175 gfc_internal_error ("spec_dimen_size(): Bad dimension");
2176
2177 if (as->type != AS_EXPLICIT
2178 || as->lower[dimen]->expr_type != EXPR_CONSTANT
2179 || as->upper[dimen]->expr_type != EXPR_CONSTANT
2180 || as->lower[dimen]->ts.type != BT_INTEGER
2181 || as->upper[dimen]->ts.type != BT_INTEGER)
2182 return false;
2183
2184 mpz_init (*result);
2185
2186 mpz_sub (*result, as->upper[dimen]->value.integer,
2187 as->lower[dimen]->value.integer);
2188
2189 mpz_add_ui (*result, *result, 1);
2190
2191 return true;
2192 }
2193
2194
2195 bool
2196 spec_size (gfc_array_spec *as, mpz_t *result)
2197 {
2198 mpz_t size;
2199 int d;
2200
2201 if (!as || as->type == AS_ASSUMED_RANK)
2202 return false;
2203
2204 mpz_init_set_ui (*result, 1);
2205
2206 for (d = 0; d < as->rank; d++)
2207 {
2208 if (!spec_dimen_size (as, d, &size))
2209 {
2210 mpz_clear (*result);
2211 return false;
2212 }
2213
2214 mpz_mul (*result, *result, size);
2215 mpz_clear (size);
2216 }
2217
2218 return true;
2219 }
2220
2221
2222 /* Get the number of elements in an array section. Optionally, also supply
2223 the end value. */
2224
2225 bool
2226 gfc_ref_dimen_size (gfc_array_ref *ar, int dimen, mpz_t *result, mpz_t *end)
2227 {
2228 mpz_t upper, lower, stride;
2229 mpz_t diff;
2230 bool t;
2231 gfc_expr *stride_expr = NULL;
2232
2233 if (dimen < 0 || ar == NULL)
2234 gfc_internal_error ("gfc_ref_dimen_size(): Bad dimension");
2235
2236 if (dimen > ar->dimen - 1)
2237 {
2238 gfc_error ("Bad array dimension at %L", &ar->c_where[dimen]);
2239 return false;
2240 }
2241
2242 switch (ar->dimen_type[dimen])
2243 {
2244 case DIMEN_ELEMENT:
2245 mpz_init (*result);
2246 mpz_set_ui (*result, 1);
2247 t = true;
2248 break;
2249
2250 case DIMEN_VECTOR:
2251 t = gfc_array_size (ar->start[dimen], result); /* Recurse! */
2252 break;
2253
2254 case DIMEN_RANGE:
2255
2256 mpz_init (stride);
2257
2258 if (ar->stride[dimen] == NULL)
2259 mpz_set_ui (stride, 1);
2260 else
2261 {
2262 stride_expr = gfc_copy_expr(ar->stride[dimen]);
2263
2264 if(!gfc_simplify_expr(stride_expr, 1))
2265 gfc_internal_error("Simplification error");
2266
2267 if (stride_expr->expr_type != EXPR_CONSTANT
2268 || mpz_cmp_ui (stride_expr->value.integer, 0) == 0)
2269 {
2270 mpz_clear (stride);
2271 return false;
2272 }
2273 mpz_set (stride, stride_expr->value.integer);
2274 gfc_free_expr(stride_expr);
2275 }
2276
2277 /* Calculate the number of elements via gfc_dep_differce, but only if
2278 start and end are both supplied in the reference or the array spec.
2279 This is to guard against strange but valid code like
2280
2281 subroutine foo(a,n)
2282 real a(1:n)
2283 n = 3
2284 print *,size(a(n-1:))
2285
2286 where the user changes the value of a variable. If we have to
2287 determine end as well, we cannot do this using gfc_dep_difference.
2288 Fall back to the constants-only code then. */
2289
2290 if (end == NULL)
2291 {
2292 bool use_dep;
2293
2294 use_dep = gfc_dep_difference (ar->end[dimen], ar->start[dimen],
2295 &diff);
2296 if (!use_dep && ar->end[dimen] == NULL && ar->start[dimen] == NULL)
2297 use_dep = gfc_dep_difference (ar->as->upper[dimen],
2298 ar->as->lower[dimen], &diff);
2299
2300 if (use_dep)
2301 {
2302 mpz_init (*result);
2303 mpz_add (*result, diff, stride);
2304 mpz_div (*result, *result, stride);
2305 if (mpz_cmp_ui (*result, 0) < 0)
2306 mpz_set_ui (*result, 0);
2307
2308 mpz_clear (stride);
2309 mpz_clear (diff);
2310 return true;
2311 }
2312
2313 }
2314
2315 /* Constant-only code here, which covers more cases
2316 like a(:4) etc. */
2317 mpz_init (upper);
2318 mpz_init (lower);
2319 t = false;
2320
2321 if (ar->start[dimen] == NULL)
2322 {
2323 if (ar->as->lower[dimen] == NULL
2324 || ar->as->lower[dimen]->expr_type != EXPR_CONSTANT
2325 || ar->as->lower[dimen]->ts.type != BT_INTEGER)
2326 goto cleanup;
2327 mpz_set (lower, ar->as->lower[dimen]->value.integer);
2328 }
2329 else
2330 {
2331 if (ar->start[dimen]->expr_type != EXPR_CONSTANT)
2332 goto cleanup;
2333 mpz_set (lower, ar->start[dimen]->value.integer);
2334 }
2335
2336 if (ar->end[dimen] == NULL)
2337 {
2338 if (ar->as->upper[dimen] == NULL
2339 || ar->as->upper[dimen]->expr_type != EXPR_CONSTANT
2340 || ar->as->upper[dimen]->ts.type != BT_INTEGER)
2341 goto cleanup;
2342 mpz_set (upper, ar->as->upper[dimen]->value.integer);
2343 }
2344 else
2345 {
2346 if (ar->end[dimen]->expr_type != EXPR_CONSTANT)
2347 goto cleanup;
2348 mpz_set (upper, ar->end[dimen]->value.integer);
2349 }
2350
2351 mpz_init (*result);
2352 mpz_sub (*result, upper, lower);
2353 mpz_add (*result, *result, stride);
2354 mpz_div (*result, *result, stride);
2355
2356 /* Zero stride caught earlier. */
2357 if (mpz_cmp_ui (*result, 0) < 0)
2358 mpz_set_ui (*result, 0);
2359 t = true;
2360
2361 if (end)
2362 {
2363 mpz_init (*end);
2364
2365 mpz_sub_ui (*end, *result, 1UL);
2366 mpz_mul (*end, *end, stride);
2367 mpz_add (*end, *end, lower);
2368 }
2369
2370 cleanup:
2371 mpz_clear (upper);
2372 mpz_clear (lower);
2373 mpz_clear (stride);
2374 return t;
2375
2376 default:
2377 gfc_internal_error ("gfc_ref_dimen_size(): Bad dimen_type");
2378 }
2379
2380 return t;
2381 }
2382
2383
2384 static bool
2385 ref_size (gfc_array_ref *ar, mpz_t *result)
2386 {
2387 mpz_t size;
2388 int d;
2389
2390 mpz_init_set_ui (*result, 1);
2391
2392 for (d = 0; d < ar->dimen; d++)
2393 {
2394 if (!gfc_ref_dimen_size (ar, d, &size, NULL))
2395 {
2396 mpz_clear (*result);
2397 return false;
2398 }
2399
2400 mpz_mul (*result, *result, size);
2401 mpz_clear (size);
2402 }
2403
2404 return true;
2405 }
2406
2407
2408 /* Given an array expression and a dimension, figure out how many
2409 elements it has along that dimension. Returns true if we were
2410 able to return a result in the 'result' variable, false
2411 otherwise. */
2412
2413 bool
2414 gfc_array_dimen_size (gfc_expr *array, int dimen, mpz_t *result)
2415 {
2416 gfc_ref *ref;
2417 int i;
2418
2419 gcc_assert (array != NULL);
2420
2421 if (array->ts.type == BT_CLASS)
2422 return false;
2423
2424 if (array->rank == -1)
2425 return false;
2426
2427 if (dimen < 0 || dimen > array->rank - 1)
2428 gfc_internal_error ("gfc_array_dimen_size(): Bad dimension");
2429
2430 switch (array->expr_type)
2431 {
2432 case EXPR_VARIABLE:
2433 case EXPR_FUNCTION:
2434 for (ref = array->ref; ref; ref = ref->next)
2435 {
2436 if (ref->type != REF_ARRAY)
2437 continue;
2438
2439 if (ref->u.ar.type == AR_FULL)
2440 return spec_dimen_size (ref->u.ar.as, dimen, result);
2441
2442 if (ref->u.ar.type == AR_SECTION)
2443 {
2444 for (i = 0; dimen >= 0; i++)
2445 if (ref->u.ar.dimen_type[i] != DIMEN_ELEMENT)
2446 dimen--;
2447
2448 return gfc_ref_dimen_size (&ref->u.ar, i - 1, result, NULL);
2449 }
2450 }
2451
2452 if (array->shape && array->shape[dimen])
2453 {
2454 mpz_init_set (*result, array->shape[dimen]);
2455 return true;
2456 }
2457
2458 if (array->symtree->n.sym->attr.generic
2459 && array->value.function.esym != NULL)
2460 {
2461 if (!spec_dimen_size (array->value.function.esym->as, dimen, result))
2462 return false;
2463 }
2464 else if (!spec_dimen_size (array->symtree->n.sym->as, dimen, result))
2465 return false;
2466
2467 break;
2468
2469 case EXPR_ARRAY:
2470 if (array->shape == NULL) {
2471 /* Expressions with rank > 1 should have "shape" properly set */
2472 if ( array->rank != 1 )
2473 gfc_internal_error ("gfc_array_dimen_size(): Bad EXPR_ARRAY expr");
2474 return gfc_array_size(array, result);
2475 }
2476
2477 /* Fall through */
2478 default:
2479 if (array->shape == NULL)
2480 return false;
2481
2482 mpz_init_set (*result, array->shape[dimen]);
2483
2484 break;
2485 }
2486
2487 return true;
2488 }
2489
2490
2491 /* Given an array expression, figure out how many elements are in the
2492 array. Returns true if this is possible, and sets the 'result'
2493 variable. Otherwise returns false. */
2494
2495 bool
2496 gfc_array_size (gfc_expr *array, mpz_t *result)
2497 {
2498 expand_info expand_save;
2499 gfc_ref *ref;
2500 int i;
2501 bool t;
2502
2503 if (array->ts.type == BT_CLASS)
2504 return false;
2505
2506 switch (array->expr_type)
2507 {
2508 case EXPR_ARRAY:
2509 gfc_push_suppress_errors ();
2510
2511 expand_save = current_expand;
2512
2513 current_expand.count = result;
2514 mpz_init_set_ui (*result, 0);
2515
2516 current_expand.expand_work_function = count_elements;
2517 iter_stack = NULL;
2518
2519 t = expand_constructor (array->value.constructor);
2520
2521 gfc_pop_suppress_errors ();
2522
2523 if (!t)
2524 mpz_clear (*result);
2525 current_expand = expand_save;
2526 return t;
2527
2528 case EXPR_VARIABLE:
2529 for (ref = array->ref; ref; ref = ref->next)
2530 {
2531 if (ref->type != REF_ARRAY)
2532 continue;
2533
2534 if (ref->u.ar.type == AR_FULL)
2535 return spec_size (ref->u.ar.as, result);
2536
2537 if (ref->u.ar.type == AR_SECTION)
2538 return ref_size (&ref->u.ar, result);
2539 }
2540
2541 return spec_size (array->symtree->n.sym->as, result);
2542
2543
2544 default:
2545 if (array->rank == 0 || array->shape == NULL)
2546 return false;
2547
2548 mpz_init_set_ui (*result, 1);
2549
2550 for (i = 0; i < array->rank; i++)
2551 mpz_mul (*result, *result, array->shape[i]);
2552
2553 break;
2554 }
2555
2556 return true;
2557 }
2558
2559
2560 /* Given an array reference, return the shape of the reference in an
2561 array of mpz_t integers. */
2562
2563 bool
2564 gfc_array_ref_shape (gfc_array_ref *ar, mpz_t *shape)
2565 {
2566 int d;
2567 int i;
2568
2569 d = 0;
2570
2571 switch (ar->type)
2572 {
2573 case AR_FULL:
2574 for (; d < ar->as->rank; d++)
2575 if (!spec_dimen_size (ar->as, d, &shape[d]))
2576 goto cleanup;
2577
2578 return true;
2579
2580 case AR_SECTION:
2581 for (i = 0; i < ar->dimen; i++)
2582 {
2583 if (ar->dimen_type[i] != DIMEN_ELEMENT)
2584 {
2585 if (!gfc_ref_dimen_size (ar, i, &shape[d], NULL))
2586 goto cleanup;
2587 d++;
2588 }
2589 }
2590
2591 return true;
2592
2593 default:
2594 break;
2595 }
2596
2597 cleanup:
2598 gfc_clear_shape (shape, d);
2599 return false;
2600 }
2601
2602
2603 /* Given an array expression, find the array reference structure that
2604 characterizes the reference. */
2605
2606 gfc_array_ref *
2607 gfc_find_array_ref (gfc_expr *e, bool allow_null)
2608 {
2609 gfc_ref *ref;
2610
2611 for (ref = e->ref; ref; ref = ref->next)
2612 if (ref->type == REF_ARRAY
2613 && (ref->u.ar.type == AR_FULL || ref->u.ar.type == AR_SECTION))
2614 break;
2615
2616 if (ref == NULL)
2617 {
2618 if (allow_null)
2619 return NULL;
2620 else
2621 gfc_internal_error ("gfc_find_array_ref(): No ref found");
2622 }
2623
2624 return &ref->u.ar;
2625 }
2626
2627
2628 /* Find out if an array shape is known at compile time. */
2629
2630 bool
2631 gfc_is_compile_time_shape (gfc_array_spec *as)
2632 {
2633 if (as->type != AS_EXPLICIT)
2634 return false;
2635
2636 for (int i = 0; i < as->rank; i++)
2637 if (!gfc_is_constant_expr (as->lower[i])
2638 || !gfc_is_constant_expr (as->upper[i]))
2639 return false;
2640
2641 return true;
2642 }