OSDN Git Service

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