OSDN Git Service

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