OSDN Git Service

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