OSDN Git Service

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