OSDN Git Service

2008-05-16 Tobias Burnus <burnus@net-b.de>
[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 = gfc_getmem (sizeof(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 is a constant character array and
1580    not specified character length, update character length to the maximum of
1581    its element constructors' length.  For arrays with fixed length, pad the
1582    elements as necessary with needed_length.  */
1583
1584 void
1585 gfc_resolve_character_array_constructor (gfc_expr *expr)
1586 {
1587   gfc_constructor *p;
1588   int max_length;
1589   bool generated_length;
1590
1591   gcc_assert (expr->expr_type == EXPR_ARRAY);
1592   gcc_assert (expr->ts.type == BT_CHARACTER);
1593
1594   max_length = -1;
1595
1596   if (expr->ts.cl == NULL)
1597     {
1598       for (p = expr->value.constructor; p; p = p->next)
1599         if (p->expr->ts.cl != NULL)
1600           {
1601             /* Ensure that if there is a char_len around that it is
1602                used; otherwise the middle-end confuses them!  */
1603             expr->ts.cl = p->expr->ts.cl;
1604             goto got_charlen;
1605           }
1606
1607       expr->ts.cl = gfc_get_charlen ();
1608       expr->ts.cl->next = gfc_current_ns->cl_list;
1609       gfc_current_ns->cl_list = expr->ts.cl;
1610     }
1611
1612 got_charlen:
1613
1614   generated_length = false;
1615   if (expr->ts.cl->length == NULL)
1616     {
1617       /* Find the maximum length of the elements. Do nothing for variable
1618          array constructor, unless the character length is constant or
1619          there is a constant substring reference.  */
1620
1621       for (p = expr->value.constructor; p; p = p->next)
1622         {
1623           gfc_ref *ref;
1624           for (ref = p->expr->ref; ref; ref = ref->next)
1625             if (ref->type == REF_SUBSTRING
1626                 && ref->u.ss.start->expr_type == EXPR_CONSTANT
1627                 && ref->u.ss.end->expr_type == EXPR_CONSTANT)
1628               break;
1629
1630           if (p->expr->expr_type == EXPR_CONSTANT)
1631             max_length = MAX (p->expr->value.character.length, max_length);
1632           else if (ref)
1633             {
1634               long j;
1635               j = mpz_get_ui (ref->u.ss.end->value.integer)
1636                 - mpz_get_ui (ref->u.ss.start->value.integer) + 1;
1637               max_length = MAX ((int) j, max_length);
1638             }
1639           else if (p->expr->ts.cl && p->expr->ts.cl->length
1640                    && p->expr->ts.cl->length->expr_type == EXPR_CONSTANT)
1641             {
1642               long j;
1643               j = mpz_get_si (p->expr->ts.cl->length->value.integer);
1644               max_length = MAX ((int) j, max_length);
1645             }
1646           else
1647             return;
1648         }
1649
1650       if (max_length != -1)
1651         {
1652           /* Update the character length of the array constructor.  */
1653           expr->ts.cl->length = gfc_int_expr (max_length);
1654           generated_length = true;
1655           /* Real update follows below.  */
1656         }
1657     }
1658   else 
1659     {
1660       /* We've got a character length specified.  It should be an integer,
1661          otherwise an error is signalled elsewhere.  */
1662       gcc_assert (expr->ts.cl->length);
1663
1664       /* If we've got a constant character length, pad according to this.
1665          gfc_extract_int does check for BT_INTEGER and EXPR_CONSTANT and sets
1666          max_length only if they pass.  */
1667       gfc_extract_int (expr->ts.cl->length, &max_length);
1668     }
1669
1670   /* Found a length to update to, do it for all element strings shorter than
1671      the target length.  */
1672   if (max_length != -1)
1673     {
1674       for (p = expr->value.constructor; p; p = p->next)
1675         if (p->expr->expr_type == EXPR_CONSTANT)
1676           {
1677             gfc_expr *cl = NULL;
1678             int current_length = -1;
1679
1680             if (p->expr->ts.cl && p->expr->ts.cl->length)
1681             {
1682               cl = p->expr->ts.cl->length;
1683               gfc_extract_int (cl, &current_length);
1684             }
1685
1686             /* If gfc_extract_int above set current_length, we implicitly
1687                know the type is BT_INTEGER and it's EXPR_CONSTANT.  */
1688
1689             if (generated_length || ! cl
1690                 || (current_length != -1 && current_length < max_length))
1691               gfc_set_constant_character_len (max_length, p->expr, true);
1692           }
1693     }
1694 }
1695
1696
1697 /* Resolve all of the expressions in an array list.  */
1698
1699 try
1700 gfc_resolve_array_constructor (gfc_expr *expr)
1701 {
1702   try t;
1703
1704   t = resolve_array_list (expr->value.constructor);
1705   if (t == SUCCESS)
1706     t = gfc_check_constructor_type (expr);
1707   if (t == SUCCESS && expr->ts.type == BT_CHARACTER)
1708     gfc_resolve_character_array_constructor (expr);
1709
1710   return t;
1711 }
1712
1713
1714 /* Copy an iterator structure.  */
1715
1716 static gfc_iterator *
1717 copy_iterator (gfc_iterator *src)
1718 {
1719   gfc_iterator *dest;
1720
1721   if (src == NULL)
1722     return NULL;
1723
1724   dest = gfc_get_iterator ();
1725
1726   dest->var = gfc_copy_expr (src->var);
1727   dest->start = gfc_copy_expr (src->start);
1728   dest->end = gfc_copy_expr (src->end);
1729   dest->step = gfc_copy_expr (src->step);
1730
1731   return dest;
1732 }
1733
1734
1735 /* Copy a constructor structure.  */
1736
1737 gfc_constructor *
1738 gfc_copy_constructor (gfc_constructor *src)
1739 {
1740   gfc_constructor *dest;
1741   gfc_constructor *tail;
1742
1743   if (src == NULL)
1744     return NULL;
1745
1746   dest = tail = NULL;
1747   while (src)
1748     {
1749       if (dest == NULL)
1750         dest = tail = gfc_get_constructor ();
1751       else
1752         {
1753           tail->next = gfc_get_constructor ();
1754           tail = tail->next;
1755         }
1756       tail->where = src->where;
1757       tail->expr = gfc_copy_expr (src->expr);
1758       tail->iterator = copy_iterator (src->iterator);
1759       mpz_set (tail->n.offset, src->n.offset);
1760       tail->n.component = src->n.component;
1761       mpz_set (tail->repeat, src->repeat);
1762       src = src->next;
1763     }
1764
1765   return dest;
1766 }
1767
1768
1769 /* Given an array expression and an element number (starting at zero),
1770    return a pointer to the array element.  NULL is returned if the
1771    size of the array has been exceeded.  The expression node returned
1772    remains a part of the array and should not be freed.  Access is not
1773    efficient at all, but this is another place where things do not
1774    have to be particularly fast.  */
1775
1776 gfc_expr *
1777 gfc_get_array_element (gfc_expr *array, int element)
1778 {
1779   expand_info expand_save;
1780   gfc_expr *e;
1781   try rc;
1782
1783   expand_save = current_expand;
1784   current_expand.extract_n = element;
1785   current_expand.expand_work_function = extract_element;
1786   current_expand.extracted = NULL;
1787   current_expand.extract_count = 0;
1788
1789   iter_stack = NULL;
1790
1791   rc = expand_constructor (array->value.constructor);
1792   e = current_expand.extracted;
1793   current_expand = expand_save;
1794
1795   if (rc == FAILURE)
1796     return NULL;
1797
1798   return e;
1799 }
1800
1801
1802 /********* Subroutines for determining the size of an array *********/
1803
1804 /* These are needed just to accommodate RESHAPE().  There are no
1805    diagnostics here, we just return a negative number if something
1806    goes wrong.  */
1807
1808
1809 /* Get the size of single dimension of an array specification.  The
1810    array is guaranteed to be one dimensional.  */
1811
1812 try
1813 spec_dimen_size (gfc_array_spec *as, int dimen, mpz_t *result)
1814 {
1815   if (as == NULL)
1816     return FAILURE;
1817
1818   if (dimen < 0 || dimen > as->rank - 1)
1819     gfc_internal_error ("spec_dimen_size(): Bad dimension");
1820
1821   if (as->type != AS_EXPLICIT
1822       || as->lower[dimen]->expr_type != EXPR_CONSTANT
1823       || as->upper[dimen]->expr_type != EXPR_CONSTANT
1824       || as->lower[dimen]->ts.type != BT_INTEGER
1825       || as->upper[dimen]->ts.type != BT_INTEGER)
1826     return FAILURE;
1827
1828   mpz_init (*result);
1829
1830   mpz_sub (*result, as->upper[dimen]->value.integer,
1831            as->lower[dimen]->value.integer);
1832
1833   mpz_add_ui (*result, *result, 1);
1834
1835   return SUCCESS;
1836 }
1837
1838
1839 try
1840 spec_size (gfc_array_spec *as, mpz_t *result)
1841 {
1842   mpz_t size;
1843   int d;
1844
1845   mpz_init_set_ui (*result, 1);
1846
1847   for (d = 0; d < as->rank; d++)
1848     {
1849       if (spec_dimen_size (as, d, &size) == FAILURE)
1850         {
1851           mpz_clear (*result);
1852           return FAILURE;
1853         }
1854
1855       mpz_mul (*result, *result, size);
1856       mpz_clear (size);
1857     }
1858
1859   return SUCCESS;
1860 }
1861
1862
1863 /* Get the number of elements in an array section.  */
1864
1865 static try
1866 ref_dimen_size (gfc_array_ref *ar, int dimen, mpz_t *result)
1867 {
1868   mpz_t upper, lower, stride;
1869   try t;
1870
1871   if (dimen < 0 || ar == NULL || dimen > ar->dimen - 1)
1872     gfc_internal_error ("ref_dimen_size(): Bad dimension");
1873
1874   switch (ar->dimen_type[dimen])
1875     {
1876     case DIMEN_ELEMENT:
1877       mpz_init (*result);
1878       mpz_set_ui (*result, 1);
1879       t = SUCCESS;
1880       break;
1881
1882     case DIMEN_VECTOR:
1883       t = gfc_array_size (ar->start[dimen], result);    /* Recurse! */
1884       break;
1885
1886     case DIMEN_RANGE:
1887       mpz_init (upper);
1888       mpz_init (lower);
1889       mpz_init (stride);
1890       t = FAILURE;
1891
1892       if (ar->start[dimen] == NULL)
1893         {
1894           if (ar->as->lower[dimen] == NULL
1895               || ar->as->lower[dimen]->expr_type != EXPR_CONSTANT)
1896             goto cleanup;
1897           mpz_set (lower, ar->as->lower[dimen]->value.integer);
1898         }
1899       else
1900         {
1901           if (ar->start[dimen]->expr_type != EXPR_CONSTANT)
1902             goto cleanup;
1903           mpz_set (lower, ar->start[dimen]->value.integer);
1904         }
1905
1906       if (ar->end[dimen] == NULL)
1907         {
1908           if (ar->as->upper[dimen] == NULL
1909               || ar->as->upper[dimen]->expr_type != EXPR_CONSTANT)
1910             goto cleanup;
1911           mpz_set (upper, ar->as->upper[dimen]->value.integer);
1912         }
1913       else
1914         {
1915           if (ar->end[dimen]->expr_type != EXPR_CONSTANT)
1916             goto cleanup;
1917           mpz_set (upper, ar->end[dimen]->value.integer);
1918         }
1919
1920       if (ar->stride[dimen] == NULL)
1921         mpz_set_ui (stride, 1);
1922       else
1923         {
1924           if (ar->stride[dimen]->expr_type != EXPR_CONSTANT)
1925             goto cleanup;
1926           mpz_set (stride, ar->stride[dimen]->value.integer);
1927         }
1928
1929       mpz_init (*result);
1930       mpz_sub (*result, upper, lower);
1931       mpz_add (*result, *result, stride);
1932       mpz_div (*result, *result, stride);
1933
1934       /* Zero stride caught earlier.  */
1935       if (mpz_cmp_ui (*result, 0) < 0)
1936         mpz_set_ui (*result, 0);
1937       t = SUCCESS;
1938
1939     cleanup:
1940       mpz_clear (upper);
1941       mpz_clear (lower);
1942       mpz_clear (stride);
1943       return t;
1944
1945     default:
1946       gfc_internal_error ("ref_dimen_size(): Bad dimen_type");
1947     }
1948
1949   return t;
1950 }
1951
1952
1953 static try
1954 ref_size (gfc_array_ref *ar, mpz_t *result)
1955 {
1956   mpz_t size;
1957   int d;
1958
1959   mpz_init_set_ui (*result, 1);
1960
1961   for (d = 0; d < ar->dimen; d++)
1962     {
1963       if (ref_dimen_size (ar, d, &size) == FAILURE)
1964         {
1965           mpz_clear (*result);
1966           return FAILURE;
1967         }
1968
1969       mpz_mul (*result, *result, size);
1970       mpz_clear (size);
1971     }
1972
1973   return SUCCESS;
1974 }
1975
1976
1977 /* Given an array expression and a dimension, figure out how many
1978    elements it has along that dimension.  Returns SUCCESS if we were
1979    able to return a result in the 'result' variable, FAILURE
1980    otherwise.  */
1981
1982 try
1983 gfc_array_dimen_size (gfc_expr *array, int dimen, mpz_t *result)
1984 {
1985   gfc_ref *ref;
1986   int i;
1987
1988   if (dimen < 0 || array == NULL || dimen > array->rank - 1)
1989     gfc_internal_error ("gfc_array_dimen_size(): Bad dimension");
1990
1991   switch (array->expr_type)
1992     {
1993     case EXPR_VARIABLE:
1994     case EXPR_FUNCTION:
1995       for (ref = array->ref; ref; ref = ref->next)
1996         {
1997           if (ref->type != REF_ARRAY)
1998             continue;
1999
2000           if (ref->u.ar.type == AR_FULL)
2001             return spec_dimen_size (ref->u.ar.as, dimen, result);
2002
2003           if (ref->u.ar.type == AR_SECTION)
2004             {
2005               for (i = 0; dimen >= 0; i++)
2006                 if (ref->u.ar.dimen_type[i] != DIMEN_ELEMENT)
2007                   dimen--;
2008
2009               return ref_dimen_size (&ref->u.ar, i - 1, result);
2010             }
2011         }
2012
2013       if (array->shape && array->shape[dimen])
2014         {
2015           mpz_init_set (*result, array->shape[dimen]);
2016           return SUCCESS;
2017         }
2018
2019       if (spec_dimen_size (array->symtree->n.sym->as, dimen, result) == FAILURE)
2020         return FAILURE;
2021
2022       break;
2023
2024     case EXPR_ARRAY:
2025       if (array->shape == NULL) {
2026         /* Expressions with rank > 1 should have "shape" properly set */
2027         if ( array->rank != 1 )
2028           gfc_internal_error ("gfc_array_dimen_size(): Bad EXPR_ARRAY expr");
2029         return gfc_array_size(array, result);
2030       }
2031
2032       /* Fall through */
2033     default:
2034       if (array->shape == NULL)
2035         return FAILURE;
2036
2037       mpz_init_set (*result, array->shape[dimen]);
2038
2039       break;
2040     }
2041
2042   return SUCCESS;
2043 }
2044
2045
2046 /* Given an array expression, figure out how many elements are in the
2047    array.  Returns SUCCESS if this is possible, and sets the 'result'
2048    variable.  Otherwise returns FAILURE.  */
2049
2050 try
2051 gfc_array_size (gfc_expr *array, mpz_t *result)
2052 {
2053   expand_info expand_save;
2054   gfc_ref *ref;
2055   int i, flag;
2056   try t;
2057
2058   switch (array->expr_type)
2059     {
2060     case EXPR_ARRAY:
2061       flag = gfc_suppress_error;
2062       gfc_suppress_error = 1;
2063
2064       expand_save = current_expand;
2065
2066       current_expand.count = result;
2067       mpz_init_set_ui (*result, 0);
2068
2069       current_expand.expand_work_function = count_elements;
2070       iter_stack = NULL;
2071
2072       t = expand_constructor (array->value.constructor);
2073       gfc_suppress_error = flag;
2074
2075       if (t == FAILURE)
2076         mpz_clear (*result);
2077       current_expand = expand_save;
2078       return t;
2079
2080     case EXPR_VARIABLE:
2081       for (ref = array->ref; ref; ref = ref->next)
2082         {
2083           if (ref->type != REF_ARRAY)
2084             continue;
2085
2086           if (ref->u.ar.type == AR_FULL)
2087             return spec_size (ref->u.ar.as, result);
2088
2089           if (ref->u.ar.type == AR_SECTION)
2090             return ref_size (&ref->u.ar, result);
2091         }
2092
2093       return spec_size (array->symtree->n.sym->as, result);
2094
2095
2096     default:
2097       if (array->rank == 0 || array->shape == NULL)
2098         return FAILURE;
2099
2100       mpz_init_set_ui (*result, 1);
2101
2102       for (i = 0; i < array->rank; i++)
2103         mpz_mul (*result, *result, array->shape[i]);
2104
2105       break;
2106     }
2107
2108   return SUCCESS;
2109 }
2110
2111
2112 /* Given an array reference, return the shape of the reference in an
2113    array of mpz_t integers.  */
2114
2115 try
2116 gfc_array_ref_shape (gfc_array_ref *ar, mpz_t *shape)
2117 {
2118   int d;
2119   int i;
2120
2121   d = 0;
2122
2123   switch (ar->type)
2124     {
2125     case AR_FULL:
2126       for (; d < ar->as->rank; d++)
2127         if (spec_dimen_size (ar->as, d, &shape[d]) == FAILURE)
2128           goto cleanup;
2129
2130       return SUCCESS;
2131
2132     case AR_SECTION:
2133       for (i = 0; i < ar->dimen; i++)
2134         {
2135           if (ar->dimen_type[i] != DIMEN_ELEMENT)
2136             {
2137               if (ref_dimen_size (ar, i, &shape[d]) == FAILURE)
2138                 goto cleanup;
2139               d++;
2140             }
2141         }
2142
2143       return SUCCESS;
2144
2145     default:
2146       break;
2147     }
2148
2149 cleanup:
2150   for (d--; d >= 0; d--)
2151     mpz_clear (shape[d]);
2152
2153   return FAILURE;
2154 }
2155
2156
2157 /* Given an array expression, find the array reference structure that
2158    characterizes the reference.  */
2159
2160 gfc_array_ref *
2161 gfc_find_array_ref (gfc_expr *e)
2162 {
2163   gfc_ref *ref;
2164
2165   for (ref = e->ref; ref; ref = ref->next)
2166     if (ref->type == REF_ARRAY
2167         && (ref->u.ar.type == AR_FULL || ref->u.ar.type == AR_SECTION))
2168       break;
2169
2170   if (ref == NULL)
2171     gfc_internal_error ("gfc_find_array_ref(): No ref found");
2172
2173   return &ref->u.ar;
2174 }
2175
2176
2177 /* Find out if an array shape is known at compile time.  */
2178
2179 int
2180 gfc_is_compile_time_shape (gfc_array_spec *as)
2181 {
2182   int i;
2183
2184   if (as->type != AS_EXPLICIT)
2185     return 0;
2186
2187   for (i = 0; i < as->rank; i++)
2188     if (!gfc_is_constant_expr (as->lower[i])
2189         || !gfc_is_constant_expr (as->upper[i]))
2190       return 0;
2191
2192   return 1;
2193 }