OSDN Git Service

2006-02-13 Andrew Pinski <pinskia@physics.uc.edu>
[pf3gnuchains/gcc-fork.git] / gcc / fortran / match.c
1 /* Matching subroutines in all sizes, shapes and colors.
2    Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software
3    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 2, 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 COPYING.  If not, write to the Free
20 Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
21 02110-1301, USA.  */
22
23
24 #include "config.h"
25 #include "system.h"
26 #include "flags.h"
27 #include "gfortran.h"
28 #include "match.h"
29 #include "parse.h"
30
31 /* For matching and debugging purposes.  Order matters here!  The
32    unary operators /must/ precede the binary plus and minus, or
33    the expression parser breaks.  */
34
35 mstring intrinsic_operators[] = {
36     minit ("+", INTRINSIC_UPLUS),
37     minit ("-", INTRINSIC_UMINUS),
38     minit ("+", INTRINSIC_PLUS),
39     minit ("-", INTRINSIC_MINUS),
40     minit ("**", INTRINSIC_POWER),
41     minit ("//", INTRINSIC_CONCAT),
42     minit ("*", INTRINSIC_TIMES),
43     minit ("/", INTRINSIC_DIVIDE),
44     minit (".and.", INTRINSIC_AND),
45     minit (".or.", INTRINSIC_OR),
46     minit (".eqv.", INTRINSIC_EQV),
47     minit (".neqv.", INTRINSIC_NEQV),
48     minit (".eq.", INTRINSIC_EQ),
49     minit ("==", INTRINSIC_EQ),
50     minit (".ne.", INTRINSIC_NE),
51     minit ("/=", INTRINSIC_NE),
52     minit (".ge.", INTRINSIC_GE),
53     minit (">=", INTRINSIC_GE),
54     minit (".le.", INTRINSIC_LE),
55     minit ("<=", INTRINSIC_LE),
56     minit (".lt.", INTRINSIC_LT),
57     minit ("<", INTRINSIC_LT),
58     minit (".gt.", INTRINSIC_GT),
59     minit (">", INTRINSIC_GT),
60     minit (".not.", INTRINSIC_NOT),
61     minit ("parens", INTRINSIC_PARENTHESES),
62     minit (NULL, INTRINSIC_NONE)
63 };
64
65
66 /******************** Generic matching subroutines ************************/
67
68 /* In free form, match at least one space.  Always matches in fixed
69    form.  */
70
71 match
72 gfc_match_space (void)
73 {
74   locus old_loc;
75   int c;
76
77   if (gfc_current_form == FORM_FIXED)
78     return MATCH_YES;
79
80   old_loc = gfc_current_locus;
81
82   c = gfc_next_char ();
83   if (!gfc_is_whitespace (c))
84     {
85       gfc_current_locus = old_loc;
86       return MATCH_NO;
87     }
88
89   gfc_gobble_whitespace ();
90
91   return MATCH_YES;
92 }
93
94
95 /* Match an end of statement.  End of statement is optional
96    whitespace, followed by a ';' or '\n' or comment '!'.  If a
97    semicolon is found, we continue to eat whitespace and semicolons.  */
98
99 match
100 gfc_match_eos (void)
101 {
102   locus old_loc;
103   int flag, c;
104
105   flag = 0;
106
107   for (;;)
108     {
109       old_loc = gfc_current_locus;
110       gfc_gobble_whitespace ();
111
112       c = gfc_next_char ();
113       switch (c)
114         {
115         case '!':
116           do
117             {
118               c = gfc_next_char ();
119             }
120           while (c != '\n');
121
122           /* Fall through */
123
124         case '\n':
125           return MATCH_YES;
126
127         case ';':
128           flag = 1;
129           continue;
130         }
131
132       break;
133     }
134
135   gfc_current_locus = old_loc;
136   return (flag) ? MATCH_YES : MATCH_NO;
137 }
138
139
140 /* Match a literal integer on the input, setting the value on
141    MATCH_YES.  Literal ints occur in kind-parameters as well as
142    old-style character length specifications.  If cnt is non-NULL it
143    will be set to the number of digits.  */
144
145 match
146 gfc_match_small_literal_int (int *value, int *cnt)
147 {
148   locus old_loc;
149   char c;
150   int i, j;
151
152   old_loc = gfc_current_locus;
153
154   gfc_gobble_whitespace ();
155   c = gfc_next_char ();
156   if (cnt)
157     *cnt = 0;
158
159   if (!ISDIGIT (c))
160     {
161       gfc_current_locus = old_loc;
162       return MATCH_NO;
163     }
164
165   i = c - '0';
166   j = 1;
167
168   for (;;)
169     {
170       old_loc = gfc_current_locus;
171       c = gfc_next_char ();
172
173       if (!ISDIGIT (c))
174         break;
175
176       i = 10 * i + c - '0';
177       j++;
178
179       if (i > 99999999)
180         {
181           gfc_error ("Integer too large at %C");
182           return MATCH_ERROR;
183         }
184     }
185
186   gfc_current_locus = old_loc;
187
188   *value = i;
189   if (cnt)
190     *cnt = j;
191   return MATCH_YES;
192 }
193
194
195 /* Match a small, constant integer expression, like in a kind
196    statement.  On MATCH_YES, 'value' is set.  */
197
198 match
199 gfc_match_small_int (int *value)
200 {
201   gfc_expr *expr;
202   const char *p;
203   match m;
204   int i;
205
206   m = gfc_match_expr (&expr);
207   if (m != MATCH_YES)
208     return m;
209
210   p = gfc_extract_int (expr, &i);
211   gfc_free_expr (expr);
212
213   if (p != NULL)
214     {
215       gfc_error (p);
216       m = MATCH_ERROR;
217     }
218
219   *value = i;
220   return m;
221 }
222
223
224 /* Matches a statement label.  Uses gfc_match_small_literal_int() to
225    do most of the work.  */
226
227 match
228 gfc_match_st_label (gfc_st_label ** label)
229 {
230   locus old_loc;
231   match m;
232   int i, cnt;
233
234   old_loc = gfc_current_locus;
235
236   m = gfc_match_small_literal_int (&i, &cnt);
237   if (m != MATCH_YES)
238     return m;
239
240   if (cnt > 5)
241     {
242       gfc_error ("Too many digits in statement label at %C");
243       goto cleanup;
244     }
245
246   if (i == 0)
247     {
248       gfc_error ("Statement label at %C is zero");
249       goto cleanup;
250     }
251
252   *label = gfc_get_st_label (i);
253   return MATCH_YES;
254
255 cleanup:
256
257   gfc_current_locus = old_loc;
258   return MATCH_ERROR;
259 }
260
261
262 /* Match and validate a label associated with a named IF, DO or SELECT
263    statement.  If the symbol does not have the label attribute, we add
264    it.  We also make sure the symbol does not refer to another
265    (active) block.  A matched label is pointed to by gfc_new_block.  */
266
267 match
268 gfc_match_label (void)
269 {
270   char name[GFC_MAX_SYMBOL_LEN + 1];
271   match m;
272
273   gfc_new_block = NULL;
274
275   m = gfc_match (" %n :", name);
276   if (m != MATCH_YES)
277     return m;
278
279   if (gfc_get_symbol (name, NULL, &gfc_new_block))
280     {
281       gfc_error ("Label name '%s' at %C is ambiguous", name);
282       return MATCH_ERROR;
283     }
284
285   if (gfc_new_block->attr.flavor == FL_LABEL)
286     {
287       gfc_error ("Duplicate construct label '%s' at %C", name);
288       return MATCH_ERROR;
289     }
290
291   if (gfc_add_flavor (&gfc_new_block->attr, FL_LABEL,
292                       gfc_new_block->name, NULL) == FAILURE)
293     return MATCH_ERROR;
294
295   return MATCH_YES;
296 }
297
298
299 /* Try and match the input against an array of possibilities.  If one
300    potential matching string is a substring of another, the longest
301    match takes precedence.  Spaces in the target strings are optional
302    spaces that do not necessarily have to be found in the input
303    stream.  In fixed mode, spaces never appear.  If whitespace is
304    matched, it matches unlimited whitespace in the input.  For this
305    reason, the 'mp' member of the mstring structure is used to track
306    the progress of each potential match.
307
308    If there is no match we return the tag associated with the
309    terminating NULL mstring structure and leave the locus pointer
310    where it started.  If there is a match we return the tag member of
311    the matched mstring and leave the locus pointer after the matched
312    character.
313
314    A '%' character is a mandatory space.  */
315
316 int
317 gfc_match_strings (mstring * a)
318 {
319   mstring *p, *best_match;
320   int no_match, c, possibles;
321   locus match_loc;
322
323   possibles = 0;
324
325   for (p = a; p->string != NULL; p++)
326     {
327       p->mp = p->string;
328       possibles++;
329     }
330
331   no_match = p->tag;
332
333   best_match = NULL;
334   match_loc = gfc_current_locus;
335
336   gfc_gobble_whitespace ();
337
338   while (possibles > 0)
339     {
340       c = gfc_next_char ();
341
342       /* Apply the next character to the current possibilities.  */
343       for (p = a; p->string != NULL; p++)
344         {
345           if (p->mp == NULL)
346             continue;
347
348           if (*p->mp == ' ')
349             {
350               /* Space matches 1+ whitespace(s).  */
351               if ((gfc_current_form == FORM_FREE)
352                   && gfc_is_whitespace (c))
353                 continue;
354
355               p->mp++;
356             }
357
358           if (*p->mp != c)
359             {
360               /* Match failed.  */
361               p->mp = NULL;
362               possibles--;
363               continue;
364             }
365
366           p->mp++;
367           if (*p->mp == '\0')
368             {
369               /* Found a match.  */
370               match_loc = gfc_current_locus;
371               best_match = p;
372               possibles--;
373               p->mp = NULL;
374             }
375         }
376     }
377
378   gfc_current_locus = match_loc;
379
380   return (best_match == NULL) ? no_match : best_match->tag;
381 }
382
383
384 /* See if the current input looks like a name of some sort.  Modifies
385    the passed buffer which must be GFC_MAX_SYMBOL_LEN+1 bytes long.  */
386
387 match
388 gfc_match_name (char *buffer)
389 {
390   locus old_loc;
391   int i, c;
392
393   old_loc = gfc_current_locus;
394   gfc_gobble_whitespace ();
395
396   c = gfc_next_char ();
397   if (!ISALPHA (c))
398     {
399       gfc_current_locus = old_loc;
400       return MATCH_NO;
401     }
402
403   i = 0;
404
405   do
406     {
407       buffer[i++] = c;
408
409       if (i > gfc_option.max_identifier_length)
410         {
411           gfc_error ("Name at %C is too long");
412           return MATCH_ERROR;
413         }
414
415       old_loc = gfc_current_locus;
416       c = gfc_next_char ();
417     }
418   while (ISALNUM (c)
419          || c == '_'
420          || (gfc_option.flag_dollar_ok && c == '$'));
421
422   buffer[i] = '\0';
423   gfc_current_locus = old_loc;
424
425   return MATCH_YES;
426 }
427
428
429 /* Match a symbol on the input.  Modifies the pointer to the symbol
430    pointer if successful.  */
431
432 match
433 gfc_match_sym_tree (gfc_symtree ** matched_symbol, int host_assoc)
434 {
435   char buffer[GFC_MAX_SYMBOL_LEN + 1];
436   match m;
437
438   m = gfc_match_name (buffer);
439   if (m != MATCH_YES)
440     return m;
441
442   if (host_assoc)
443     return (gfc_get_ha_sym_tree (buffer, matched_symbol))
444       ? MATCH_ERROR : MATCH_YES;
445
446   if (gfc_get_sym_tree (buffer, NULL, matched_symbol))
447     return MATCH_ERROR;
448
449   return MATCH_YES;
450 }
451
452
453 match
454 gfc_match_symbol (gfc_symbol ** matched_symbol, int host_assoc)
455 {
456   gfc_symtree *st;
457   match m;
458
459   m = gfc_match_sym_tree (&st, host_assoc);
460
461   if (m == MATCH_YES)
462     {
463       if (st)
464         *matched_symbol = st->n.sym;
465       else
466         *matched_symbol = NULL;
467     }
468   else
469     *matched_symbol = NULL;
470   return m;
471 }
472
473 /* Match an intrinsic operator.  Returns an INTRINSIC enum. While matching, 
474    we always find INTRINSIC_PLUS before INTRINSIC_UPLUS. We work around this 
475    in matchexp.c.  */
476
477 match
478 gfc_match_intrinsic_op (gfc_intrinsic_op * result)
479 {
480   gfc_intrinsic_op op;
481
482   op = (gfc_intrinsic_op) gfc_match_strings (intrinsic_operators);
483
484   if (op == INTRINSIC_NONE)
485     return MATCH_NO;
486
487   *result = op;
488   return MATCH_YES;
489 }
490
491
492 /* Match a loop control phrase:
493
494     <LVALUE> = <EXPR>, <EXPR> [, <EXPR> ]
495
496    If the final integer expression is not present, a constant unity
497    expression is returned.  We don't return MATCH_ERROR until after
498    the equals sign is seen.  */
499
500 match
501 gfc_match_iterator (gfc_iterator * iter, int init_flag)
502 {
503   char name[GFC_MAX_SYMBOL_LEN + 1];
504   gfc_expr *var, *e1, *e2, *e3;
505   locus start;
506   match m;
507
508   /* Match the start of an iterator without affecting the symbol
509      table.  */
510
511   start = gfc_current_locus;
512   m = gfc_match (" %n =", name);
513   gfc_current_locus = start;
514
515   if (m != MATCH_YES)
516     return MATCH_NO;
517
518   m = gfc_match_variable (&var, 0);
519   if (m != MATCH_YES)
520     return MATCH_NO;
521
522   gfc_match_char ('=');
523
524   e1 = e2 = e3 = NULL;
525
526   if (var->ref != NULL)
527     {
528       gfc_error ("Loop variable at %C cannot be a sub-component");
529       goto cleanup;
530     }
531
532   if (var->symtree->n.sym->attr.intent == INTENT_IN)
533     {
534       gfc_error ("Loop variable '%s' at %C cannot be INTENT(IN)",
535                  var->symtree->n.sym->name);
536       goto cleanup;
537     }
538
539   if (var->symtree->n.sym->attr.pointer)
540     {
541       gfc_error ("Loop variable at %C cannot have the POINTER attribute");
542       goto cleanup;
543     }
544
545   m = init_flag ? gfc_match_init_expr (&e1) : gfc_match_expr (&e1);
546   if (m == MATCH_NO)
547     goto syntax;
548   if (m == MATCH_ERROR)
549     goto cleanup;
550
551   if (gfc_match_char (',') != MATCH_YES)
552     goto syntax;
553
554   m = init_flag ? gfc_match_init_expr (&e2) : gfc_match_expr (&e2);
555   if (m == MATCH_NO)
556     goto syntax;
557   if (m == MATCH_ERROR)
558     goto cleanup;
559
560   if (gfc_match_char (',') != MATCH_YES)
561     {
562       e3 = gfc_int_expr (1);
563       goto done;
564     }
565
566   m = init_flag ? gfc_match_init_expr (&e3) : gfc_match_expr (&e3);
567   if (m == MATCH_ERROR)
568     goto cleanup;
569   if (m == MATCH_NO)
570     {
571       gfc_error ("Expected a step value in iterator at %C");
572       goto cleanup;
573     }
574
575 done:
576   iter->var = var;
577   iter->start = e1;
578   iter->end = e2;
579   iter->step = e3;
580   return MATCH_YES;
581
582 syntax:
583   gfc_error ("Syntax error in iterator at %C");
584
585 cleanup:
586   gfc_free_expr (e1);
587   gfc_free_expr (e2);
588   gfc_free_expr (e3);
589
590   return MATCH_ERROR;
591 }
592
593
594 /* Tries to match the next non-whitespace character on the input.
595    This subroutine does not return MATCH_ERROR.  */
596
597 match
598 gfc_match_char (char c)
599 {
600   locus where;
601
602   where = gfc_current_locus;
603   gfc_gobble_whitespace ();
604
605   if (gfc_next_char () == c)
606     return MATCH_YES;
607
608   gfc_current_locus = where;
609   return MATCH_NO;
610 }
611
612
613 /* General purpose matching subroutine.  The target string is a
614    scanf-like format string in which spaces correspond to arbitrary
615    whitespace (including no whitespace), characters correspond to
616    themselves.  The %-codes are:
617
618    %%  Literal percent sign
619    %e  Expression, pointer to a pointer is set
620    %s  Symbol, pointer to the symbol is set
621    %n  Name, character buffer is set to name
622    %t  Matches end of statement.
623    %o  Matches an intrinsic operator, returned as an INTRINSIC enum.
624    %l  Matches a statement label
625    %v  Matches a variable expression (an lvalue)
626    %   Matches a required space (in free form) and optional spaces.  */
627
628 match
629 gfc_match (const char *target, ...)
630 {
631   gfc_st_label **label;
632   int matches, *ip;
633   locus old_loc;
634   va_list argp;
635   char c, *np;
636   match m, n;
637   void **vp;
638   const char *p;
639
640   old_loc = gfc_current_locus;
641   va_start (argp, target);
642   m = MATCH_NO;
643   matches = 0;
644   p = target;
645
646 loop:
647   c = *p++;
648   switch (c)
649     {
650     case ' ':
651       gfc_gobble_whitespace ();
652       goto loop;
653     case '\0':
654       m = MATCH_YES;
655       break;
656
657     case '%':
658       c = *p++;
659       switch (c)
660         {
661         case 'e':
662           vp = va_arg (argp, void **);
663           n = gfc_match_expr ((gfc_expr **) vp);
664           if (n != MATCH_YES)
665             {
666               m = n;
667               goto not_yes;
668             }
669
670           matches++;
671           goto loop;
672
673         case 'v':
674           vp = va_arg (argp, void **);
675           n = gfc_match_variable ((gfc_expr **) vp, 0);
676           if (n != MATCH_YES)
677             {
678               m = n;
679               goto not_yes;
680             }
681
682           matches++;
683           goto loop;
684
685         case 's':
686           vp = va_arg (argp, void **);
687           n = gfc_match_symbol ((gfc_symbol **) vp, 0);
688           if (n != MATCH_YES)
689             {
690               m = n;
691               goto not_yes;
692             }
693
694           matches++;
695           goto loop;
696
697         case 'n':
698           np = va_arg (argp, char *);
699           n = gfc_match_name (np);
700           if (n != MATCH_YES)
701             {
702               m = n;
703               goto not_yes;
704             }
705
706           matches++;
707           goto loop;
708
709         case 'l':
710           label = va_arg (argp, gfc_st_label **);
711           n = gfc_match_st_label (label);
712           if (n != MATCH_YES)
713             {
714               m = n;
715               goto not_yes;
716             }
717
718           matches++;
719           goto loop;
720
721         case 'o':
722           ip = va_arg (argp, int *);
723           n = gfc_match_intrinsic_op ((gfc_intrinsic_op *) ip);
724           if (n != MATCH_YES)
725             {
726               m = n;
727               goto not_yes;
728             }
729
730           matches++;
731           goto loop;
732
733         case 't':
734           if (gfc_match_eos () != MATCH_YES)
735             {
736               m = MATCH_NO;
737               goto not_yes;
738             }
739           goto loop;
740
741         case ' ':
742           if (gfc_match_space () == MATCH_YES)
743             goto loop;
744           m = MATCH_NO;
745           goto not_yes;
746
747         case '%':
748           break;        /* Fall through to character matcher */
749
750         default:
751           gfc_internal_error ("gfc_match(): Bad match code %c", c);
752         }
753
754     default:
755       if (c == gfc_next_char ())
756         goto loop;
757       break;
758     }
759
760 not_yes:
761   va_end (argp);
762
763   if (m != MATCH_YES)
764     {
765       /* Clean up after a failed match.  */
766       gfc_current_locus = old_loc;
767       va_start (argp, target);
768
769       p = target;
770       for (; matches > 0; matches--)
771         {
772           while (*p++ != '%');
773
774           switch (*p++)
775             {
776             case '%':
777               matches++;
778               break;            /* Skip */
779
780             /* Matches that don't have to be undone */
781             case 'o':
782             case 'l':
783             case 'n':
784             case 's':
785               (void)va_arg (argp, void **);
786               break;
787
788             case 'e':
789             case 'v':
790               vp = va_arg (argp, void **);
791               gfc_free_expr (*vp);
792               *vp = NULL;
793               break;
794             }
795         }
796
797       va_end (argp);
798     }
799
800   return m;
801 }
802
803
804 /*********************** Statement level matching **********************/
805
806 /* Matches the start of a program unit, which is the program keyword
807    followed by an obligatory symbol.  */
808
809 match
810 gfc_match_program (void)
811 {
812   gfc_symbol *sym;
813   match m;
814
815   m = gfc_match ("% %s%t", &sym);
816
817   if (m == MATCH_NO)
818     {
819       gfc_error ("Invalid form of PROGRAM statement at %C");
820       m = MATCH_ERROR;
821     }
822
823   if (m == MATCH_ERROR)
824     return m;
825
826   if (gfc_add_flavor (&sym->attr, FL_PROGRAM, sym->name, NULL) == FAILURE)
827     return MATCH_ERROR;
828
829   gfc_new_block = sym;
830
831   return MATCH_YES;
832 }
833
834
835 /* Match a simple assignment statement.  */
836
837 match
838 gfc_match_assignment (void)
839 {
840   gfc_expr *lvalue, *rvalue;
841   locus old_loc;
842   match m;
843
844   old_loc = gfc_current_locus;
845
846   lvalue = rvalue = NULL;
847   m = gfc_match (" %v =", &lvalue);
848   if (m != MATCH_YES)
849     goto cleanup;
850
851   if (lvalue->symtree->n.sym->attr.flavor == FL_PARAMETER)
852     {
853       gfc_error ("Cannot assign to a PARAMETER variable at %C");
854       m = MATCH_ERROR;
855       goto cleanup;
856     }
857
858   m = gfc_match (" %e%t", &rvalue);
859   if (m != MATCH_YES)
860     goto cleanup;
861
862   gfc_set_sym_referenced (lvalue->symtree->n.sym);
863
864   new_st.op = EXEC_ASSIGN;
865   new_st.expr = lvalue;
866   new_st.expr2 = rvalue;
867
868   gfc_check_do_variable (lvalue->symtree);
869
870   return MATCH_YES;
871
872 cleanup:
873   gfc_current_locus = old_loc;
874   gfc_free_expr (lvalue);
875   gfc_free_expr (rvalue);
876   return m;
877 }
878
879
880 /* Match a pointer assignment statement.  */
881
882 match
883 gfc_match_pointer_assignment (void)
884 {
885   gfc_expr *lvalue, *rvalue;
886   locus old_loc;
887   match m;
888
889   old_loc = gfc_current_locus;
890
891   lvalue = rvalue = NULL;
892
893   m = gfc_match (" %v =>", &lvalue);
894   if (m != MATCH_YES)
895     {
896       m = MATCH_NO;
897       goto cleanup;
898     }
899
900   m = gfc_match (" %e%t", &rvalue);
901   if (m != MATCH_YES)
902     goto cleanup;
903
904   new_st.op = EXEC_POINTER_ASSIGN;
905   new_st.expr = lvalue;
906   new_st.expr2 = rvalue;
907
908   return MATCH_YES;
909
910 cleanup:
911   gfc_current_locus = old_loc;
912   gfc_free_expr (lvalue);
913   gfc_free_expr (rvalue);
914   return m;
915 }
916
917
918 /* We try to match an easy arithmetic IF statement. This only happens
919    when just after having encountered a simple IF statement. This code
920    is really duplicate with parts of the gfc_match_if code, but this is
921    *much* easier.  */
922 static match
923 match_arithmetic_if (void)
924 {
925   gfc_st_label *l1, *l2, *l3;
926   gfc_expr *expr;
927   match m;
928
929   m = gfc_match (" ( %e ) %l , %l , %l%t", &expr, &l1, &l2, &l3);
930   if (m != MATCH_YES)
931     return m;
932
933   if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
934       || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
935       || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
936     {
937       gfc_free_expr (expr);
938       return MATCH_ERROR;
939     }
940
941   if (gfc_notify_std (GFC_STD_F95_DEL,
942                       "Obsolete: arithmetic IF statement at %C") == FAILURE)
943     return MATCH_ERROR;
944
945   new_st.op = EXEC_ARITHMETIC_IF;
946   new_st.expr = expr;
947   new_st.label = l1;
948   new_st.label2 = l2;
949   new_st.label3 = l3;
950
951   return MATCH_YES;
952 }
953
954
955 /* The IF statement is a bit of a pain.  First of all, there are three
956    forms of it, the simple IF, the IF that starts a block and the
957    arithmetic IF.
958
959    There is a problem with the simple IF and that is the fact that we
960    only have a single level of undo information on symbols.  What this
961    means is for a simple IF, we must re-match the whole IF statement
962    multiple times in order to guarantee that the symbol table ends up
963    in the proper state.  */
964
965 static match match_simple_forall (void);
966 static match match_simple_where (void);
967
968 match
969 gfc_match_if (gfc_statement * if_type)
970 {
971   gfc_expr *expr;
972   gfc_st_label *l1, *l2, *l3;
973   locus old_loc;
974   gfc_code *p;
975   match m, n;
976
977   n = gfc_match_label ();
978   if (n == MATCH_ERROR)
979     return n;
980
981   old_loc = gfc_current_locus;
982
983   m = gfc_match (" if ( %e", &expr);
984   if (m != MATCH_YES)
985     return m;
986
987   if (gfc_match_char (')') != MATCH_YES)
988     {
989       gfc_error ("Syntax error in IF-expression at %C");
990       gfc_free_expr (expr);
991       return MATCH_ERROR;
992     }
993
994   m = gfc_match (" %l , %l , %l%t", &l1, &l2, &l3);
995
996   if (m == MATCH_YES)
997     {
998       if (n == MATCH_YES)
999         {
1000           gfc_error
1001             ("Block label not appropriate for arithmetic IF statement "
1002              "at %C");
1003
1004           gfc_free_expr (expr);
1005           return MATCH_ERROR;
1006         }
1007
1008       if (gfc_reference_st_label (l1, ST_LABEL_TARGET) == FAILURE
1009           || gfc_reference_st_label (l2, ST_LABEL_TARGET) == FAILURE
1010           || gfc_reference_st_label (l3, ST_LABEL_TARGET) == FAILURE)
1011         {
1012
1013           gfc_free_expr (expr);
1014           return MATCH_ERROR;
1015         }
1016       
1017       if (gfc_notify_std (GFC_STD_F95_DEL,
1018                           "Obsolete: arithmetic IF statement at %C")
1019           == FAILURE)
1020         return MATCH_ERROR;
1021
1022       new_st.op = EXEC_ARITHMETIC_IF;
1023       new_st.expr = expr;
1024       new_st.label = l1;
1025       new_st.label2 = l2;
1026       new_st.label3 = l3;
1027
1028       *if_type = ST_ARITHMETIC_IF;
1029       return MATCH_YES;
1030     }
1031
1032   if (gfc_match (" then%t") == MATCH_YES)
1033     {
1034       new_st.op = EXEC_IF;
1035       new_st.expr = expr;
1036
1037       *if_type = ST_IF_BLOCK;
1038       return MATCH_YES;
1039     }
1040
1041   if (n == MATCH_YES)
1042     {
1043       gfc_error ("Block label is not appropriate IF statement at %C");
1044
1045       gfc_free_expr (expr);
1046       return MATCH_ERROR;
1047     }
1048
1049   /* At this point the only thing left is a simple IF statement.  At
1050      this point, n has to be MATCH_NO, so we don't have to worry about
1051      re-matching a block label.  From what we've got so far, try
1052      matching an assignment.  */
1053
1054   *if_type = ST_SIMPLE_IF;
1055
1056   m = gfc_match_assignment ();
1057   if (m == MATCH_YES)
1058     goto got_match;
1059
1060   gfc_free_expr (expr);
1061   gfc_undo_symbols ();
1062   gfc_current_locus = old_loc;
1063
1064   gfc_match (" if ( %e ) ", &expr);     /* Guaranteed to match */
1065
1066   m = gfc_match_pointer_assignment ();
1067   if (m == MATCH_YES)
1068     goto got_match;
1069
1070   gfc_free_expr (expr);
1071   gfc_undo_symbols ();
1072   gfc_current_locus = old_loc;
1073
1074   gfc_match (" if ( %e ) ", &expr);     /* Guaranteed to match */
1075
1076   /* Look at the next keyword to see which matcher to call.  Matching
1077      the keyword doesn't affect the symbol table, so we don't have to
1078      restore between tries.  */
1079
1080 #define match(string, subr, statement) \
1081   if (gfc_match(string) == MATCH_YES) { m = subr(); goto got_match; }
1082
1083   gfc_clear_error ();
1084
1085   match ("allocate", gfc_match_allocate, ST_ALLOCATE)
1086     match ("assign", gfc_match_assign, ST_LABEL_ASSIGNMENT)
1087     match ("backspace", gfc_match_backspace, ST_BACKSPACE)
1088     match ("call", gfc_match_call, ST_CALL)
1089     match ("close", gfc_match_close, ST_CLOSE)
1090     match ("continue", gfc_match_continue, ST_CONTINUE)
1091     match ("cycle", gfc_match_cycle, ST_CYCLE)
1092     match ("deallocate", gfc_match_deallocate, ST_DEALLOCATE)
1093     match ("end file", gfc_match_endfile, ST_END_FILE)
1094     match ("exit", gfc_match_exit, ST_EXIT)
1095     match ("flush", gfc_match_flush, ST_FLUSH)
1096     match ("forall", match_simple_forall, ST_FORALL)
1097     match ("go to", gfc_match_goto, ST_GOTO)
1098     match ("if", match_arithmetic_if, ST_ARITHMETIC_IF)
1099     match ("inquire", gfc_match_inquire, ST_INQUIRE)
1100     match ("nullify", gfc_match_nullify, ST_NULLIFY)
1101     match ("open", gfc_match_open, ST_OPEN)
1102     match ("pause", gfc_match_pause, ST_NONE)
1103     match ("print", gfc_match_print, ST_WRITE)
1104     match ("read", gfc_match_read, ST_READ)
1105     match ("return", gfc_match_return, ST_RETURN)
1106     match ("rewind", gfc_match_rewind, ST_REWIND)
1107     match ("stop", gfc_match_stop, ST_STOP)
1108     match ("where", match_simple_where, ST_WHERE)
1109     match ("write", gfc_match_write, ST_WRITE)
1110
1111   /* All else has failed, so give up.  See if any of the matchers has
1112      stored an error message of some sort.  */
1113     if (gfc_error_check () == 0)
1114     gfc_error ("Unclassifiable statement in IF-clause at %C");
1115
1116   gfc_free_expr (expr);
1117   return MATCH_ERROR;
1118
1119 got_match:
1120   if (m == MATCH_NO)
1121     gfc_error ("Syntax error in IF-clause at %C");
1122   if (m != MATCH_YES)
1123     {
1124       gfc_free_expr (expr);
1125       return MATCH_ERROR;
1126     }
1127
1128   /* At this point, we've matched the single IF and the action clause
1129      is in new_st.  Rearrange things so that the IF statement appears
1130      in new_st.  */
1131
1132   p = gfc_get_code ();
1133   p->next = gfc_get_code ();
1134   *p->next = new_st;
1135   p->next->loc = gfc_current_locus;
1136
1137   p->expr = expr;
1138   p->op = EXEC_IF;
1139
1140   gfc_clear_new_st ();
1141
1142   new_st.op = EXEC_IF;
1143   new_st.block = p;
1144
1145   return MATCH_YES;
1146 }
1147
1148 #undef match
1149
1150
1151 /* Match an ELSE statement.  */
1152
1153 match
1154 gfc_match_else (void)
1155 {
1156   char name[GFC_MAX_SYMBOL_LEN + 1];
1157
1158   if (gfc_match_eos () == MATCH_YES)
1159     return MATCH_YES;
1160
1161   if (gfc_match_name (name) != MATCH_YES
1162       || gfc_current_block () == NULL
1163       || gfc_match_eos () != MATCH_YES)
1164     {
1165       gfc_error ("Unexpected junk after ELSE statement at %C");
1166       return MATCH_ERROR;
1167     }
1168
1169   if (strcmp (name, gfc_current_block ()->name) != 0)
1170     {
1171       gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1172                  name, gfc_current_block ()->name);
1173       return MATCH_ERROR;
1174     }
1175
1176   return MATCH_YES;
1177 }
1178
1179
1180 /* Match an ELSE IF statement.  */
1181
1182 match
1183 gfc_match_elseif (void)
1184 {
1185   char name[GFC_MAX_SYMBOL_LEN + 1];
1186   gfc_expr *expr;
1187   match m;
1188
1189   m = gfc_match (" ( %e ) then", &expr);
1190   if (m != MATCH_YES)
1191     return m;
1192
1193   if (gfc_match_eos () == MATCH_YES)
1194     goto done;
1195
1196   if (gfc_match_name (name) != MATCH_YES
1197       || gfc_current_block () == NULL
1198       || gfc_match_eos () != MATCH_YES)
1199     {
1200       gfc_error ("Unexpected junk after ELSE IF statement at %C");
1201       goto cleanup;
1202     }
1203
1204   if (strcmp (name, gfc_current_block ()->name) != 0)
1205     {
1206       gfc_error ("Label '%s' at %C doesn't match IF label '%s'",
1207                  name, gfc_current_block ()->name);
1208       goto cleanup;
1209     }
1210
1211 done:
1212   new_st.op = EXEC_IF;
1213   new_st.expr = expr;
1214   return MATCH_YES;
1215
1216 cleanup:
1217   gfc_free_expr (expr);
1218   return MATCH_ERROR;
1219 }
1220
1221
1222 /* Free a gfc_iterator structure.  */
1223
1224 void
1225 gfc_free_iterator (gfc_iterator * iter, int flag)
1226 {
1227
1228   if (iter == NULL)
1229     return;
1230
1231   gfc_free_expr (iter->var);
1232   gfc_free_expr (iter->start);
1233   gfc_free_expr (iter->end);
1234   gfc_free_expr (iter->step);
1235
1236   if (flag)
1237     gfc_free (iter);
1238 }
1239
1240
1241 /* Match a DO statement.  */
1242
1243 match
1244 gfc_match_do (void)
1245 {
1246   gfc_iterator iter, *ip;
1247   locus old_loc;
1248   gfc_st_label *label;
1249   match m;
1250
1251   old_loc = gfc_current_locus;
1252
1253   label = NULL;
1254   iter.var = iter.start = iter.end = iter.step = NULL;
1255
1256   m = gfc_match_label ();
1257   if (m == MATCH_ERROR)
1258     return m;
1259
1260   if (gfc_match (" do") != MATCH_YES)
1261     return MATCH_NO;
1262
1263   m = gfc_match_st_label (&label);
1264   if (m == MATCH_ERROR)
1265     goto cleanup;
1266
1267 /* Match an infinite DO, make it like a DO WHILE(.TRUE.) */
1268
1269   if (gfc_match_eos () == MATCH_YES)
1270     {
1271       iter.end = gfc_logical_expr (1, NULL);
1272       new_st.op = EXEC_DO_WHILE;
1273       goto done;
1274     }
1275
1276   /* match an optional comma, if no comma is found a space is obligatory.  */
1277   if (gfc_match_char(',') != MATCH_YES
1278       && gfc_match ("% ") != MATCH_YES)
1279     return MATCH_NO;
1280
1281   /* See if we have a DO WHILE.  */
1282   if (gfc_match (" while ( %e )%t", &iter.end) == MATCH_YES)
1283     {
1284       new_st.op = EXEC_DO_WHILE;
1285       goto done;
1286     }
1287
1288   /* The abortive DO WHILE may have done something to the symbol
1289      table, so we start over: */
1290   gfc_undo_symbols ();
1291   gfc_current_locus = old_loc;
1292
1293   gfc_match_label ();           /* This won't error */
1294   gfc_match (" do ");           /* This will work */
1295
1296   gfc_match_st_label (&label);  /* Can't error out */
1297   gfc_match_char (',');         /* Optional comma */
1298
1299   m = gfc_match_iterator (&iter, 0);
1300   if (m == MATCH_NO)
1301     return MATCH_NO;
1302   if (m == MATCH_ERROR)
1303     goto cleanup;
1304
1305   gfc_check_do_variable (iter.var->symtree);
1306
1307   if (gfc_match_eos () != MATCH_YES)
1308     {
1309       gfc_syntax_error (ST_DO);
1310       goto cleanup;
1311     }
1312
1313   new_st.op = EXEC_DO;
1314
1315 done:
1316   if (label != NULL
1317       && gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1318     goto cleanup;
1319
1320   new_st.label = label;
1321
1322   if (new_st.op == EXEC_DO_WHILE)
1323     new_st.expr = iter.end;
1324   else
1325     {
1326       new_st.ext.iterator = ip = gfc_get_iterator ();
1327       *ip = iter;
1328     }
1329
1330   return MATCH_YES;
1331
1332 cleanup:
1333   gfc_free_iterator (&iter, 0);
1334
1335   return MATCH_ERROR;
1336 }
1337
1338
1339 /* Match an EXIT or CYCLE statement.  */
1340
1341 static match
1342 match_exit_cycle (gfc_statement st, gfc_exec_op op)
1343 {
1344   gfc_state_data *p;
1345   gfc_symbol *sym;
1346   match m;
1347
1348   if (gfc_match_eos () == MATCH_YES)
1349     sym = NULL;
1350   else
1351     {
1352       m = gfc_match ("% %s%t", &sym);
1353       if (m == MATCH_ERROR)
1354         return MATCH_ERROR;
1355       if (m == MATCH_NO)
1356         {
1357           gfc_syntax_error (st);
1358           return MATCH_ERROR;
1359         }
1360
1361       if (sym->attr.flavor != FL_LABEL)
1362         {
1363           gfc_error ("Name '%s' in %s statement at %C is not a loop name",
1364                      sym->name, gfc_ascii_statement (st));
1365           return MATCH_ERROR;
1366         }
1367     }
1368
1369   /* Find the loop mentioned specified by the label (or lack of a
1370      label).  */
1371   for (p = gfc_state_stack; p; p = p->previous)
1372     if (p->state == COMP_DO && (sym == NULL || sym == p->sym))
1373       break;
1374
1375   if (p == NULL)
1376     {
1377       if (sym == NULL)
1378         gfc_error ("%s statement at %C is not within a loop",
1379                    gfc_ascii_statement (st));
1380       else
1381         gfc_error ("%s statement at %C is not within loop '%s'",
1382                    gfc_ascii_statement (st), sym->name);
1383
1384       return MATCH_ERROR;
1385     }
1386
1387   /* Save the first statement in the loop - needed by the backend.  */
1388   new_st.ext.whichloop = p->head;
1389
1390   new_st.op = op;
1391 /*  new_st.sym = sym;*/
1392
1393   return MATCH_YES;
1394 }
1395
1396
1397 /* Match the EXIT statement.  */
1398
1399 match
1400 gfc_match_exit (void)
1401 {
1402
1403   return match_exit_cycle (ST_EXIT, EXEC_EXIT);
1404 }
1405
1406
1407 /* Match the CYCLE statement.  */
1408
1409 match
1410 gfc_match_cycle (void)
1411 {
1412
1413   return match_exit_cycle (ST_CYCLE, EXEC_CYCLE);
1414 }
1415
1416
1417 /* Match a number or character constant after a STOP or PAUSE statement.  */
1418
1419 static match
1420 gfc_match_stopcode (gfc_statement st)
1421 {
1422   int stop_code;
1423   gfc_expr *e;
1424   match m;
1425   int cnt;
1426
1427   stop_code = -1;
1428   e = NULL;
1429
1430   if (gfc_match_eos () != MATCH_YES)
1431     {
1432       m = gfc_match_small_literal_int (&stop_code, &cnt);
1433       if (m == MATCH_ERROR)
1434         goto cleanup;
1435
1436       if (m == MATCH_YES && cnt > 5)
1437         {
1438           gfc_error ("Too many digits in STOP code at %C");
1439           goto cleanup;
1440         }
1441
1442       if (m == MATCH_NO)
1443         {
1444           /* Try a character constant.  */
1445           m = gfc_match_expr (&e);
1446           if (m == MATCH_ERROR)
1447             goto cleanup;
1448           if (m == MATCH_NO)
1449             goto syntax;
1450           if (e->ts.type != BT_CHARACTER || e->expr_type != EXPR_CONSTANT)
1451             goto syntax;
1452         }
1453
1454       if (gfc_match_eos () != MATCH_YES)
1455         goto syntax;
1456     }
1457
1458   if (gfc_pure (NULL))
1459     {
1460       gfc_error ("%s statement not allowed in PURE procedure at %C",
1461                  gfc_ascii_statement (st));
1462       goto cleanup;
1463     }
1464
1465   new_st.op = st == ST_STOP ? EXEC_STOP : EXEC_PAUSE;
1466   new_st.expr = e;
1467   new_st.ext.stop_code = stop_code;
1468
1469   return MATCH_YES;
1470
1471 syntax:
1472   gfc_syntax_error (st);
1473
1474 cleanup:
1475
1476   gfc_free_expr (e);
1477   return MATCH_ERROR;
1478 }
1479
1480 /* Match the (deprecated) PAUSE statement.  */
1481
1482 match
1483 gfc_match_pause (void)
1484 {
1485   match m;
1486
1487   m = gfc_match_stopcode (ST_PAUSE);
1488   if (m == MATCH_YES)
1489     {
1490       if (gfc_notify_std (GFC_STD_F95_DEL,
1491             "Obsolete: PAUSE statement at %C")
1492           == FAILURE)
1493         m = MATCH_ERROR;
1494     }
1495   return m;
1496 }
1497
1498
1499 /* Match the STOP statement.  */
1500
1501 match
1502 gfc_match_stop (void)
1503 {
1504   return gfc_match_stopcode (ST_STOP);
1505 }
1506
1507
1508 /* Match a CONTINUE statement.  */
1509
1510 match
1511 gfc_match_continue (void)
1512 {
1513
1514   if (gfc_match_eos () != MATCH_YES)
1515     {
1516       gfc_syntax_error (ST_CONTINUE);
1517       return MATCH_ERROR;
1518     }
1519
1520   new_st.op = EXEC_CONTINUE;
1521   return MATCH_YES;
1522 }
1523
1524
1525 /* Match the (deprecated) ASSIGN statement.  */
1526
1527 match
1528 gfc_match_assign (void)
1529 {
1530   gfc_expr *expr;
1531   gfc_st_label *label;
1532
1533   if (gfc_match (" %l", &label) == MATCH_YES)
1534     {
1535       if (gfc_reference_st_label (label, ST_LABEL_UNKNOWN) == FAILURE)
1536         return MATCH_ERROR;
1537       if (gfc_match (" to %v%t", &expr) == MATCH_YES)
1538         {
1539           if (gfc_notify_std (GFC_STD_F95_DEL,
1540                 "Obsolete: ASSIGN statement at %C")
1541               == FAILURE)
1542             return MATCH_ERROR;
1543
1544           expr->symtree->n.sym->attr.assign = 1;
1545
1546           new_st.op = EXEC_LABEL_ASSIGN;
1547           new_st.label = label;
1548           new_st.expr = expr;
1549           return MATCH_YES;
1550         }
1551     }
1552   return MATCH_NO;
1553 }
1554
1555
1556 /* Match the GO TO statement.  As a computed GOTO statement is
1557    matched, it is transformed into an equivalent SELECT block.  No
1558    tree is necessary, and the resulting jumps-to-jumps are
1559    specifically optimized away by the back end.  */
1560
1561 match
1562 gfc_match_goto (void)
1563 {
1564   gfc_code *head, *tail;
1565   gfc_expr *expr;
1566   gfc_case *cp;
1567   gfc_st_label *label;
1568   int i;
1569   match m;
1570
1571   if (gfc_match (" %l%t", &label) == MATCH_YES)
1572     {
1573       if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1574         return MATCH_ERROR;
1575
1576       new_st.op = EXEC_GOTO;
1577       new_st.label = label;
1578       return MATCH_YES;
1579     }
1580
1581   /* The assigned GO TO statement.  */ 
1582
1583   if (gfc_match_variable (&expr, 0) == MATCH_YES)
1584     {
1585       if (gfc_notify_std (GFC_STD_F95_DEL,
1586                           "Obsolete: Assigned GOTO statement at %C")
1587           == FAILURE)
1588         return MATCH_ERROR;
1589
1590       new_st.op = EXEC_GOTO;
1591       new_st.expr = expr;
1592
1593       if (gfc_match_eos () == MATCH_YES)
1594         return MATCH_YES;
1595
1596       /* Match label list.  */
1597       gfc_match_char (',');
1598       if (gfc_match_char ('(') != MATCH_YES)
1599         {
1600           gfc_syntax_error (ST_GOTO);
1601           return MATCH_ERROR;
1602         }
1603       head = tail = NULL;
1604
1605       do
1606         {
1607           m = gfc_match_st_label (&label);
1608           if (m != MATCH_YES)
1609             goto syntax;
1610
1611           if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1612             goto cleanup;
1613
1614           if (head == NULL)
1615             head = tail = gfc_get_code ();
1616           else
1617             {
1618               tail->block = gfc_get_code ();
1619               tail = tail->block;
1620             }
1621
1622           tail->label = label;
1623           tail->op = EXEC_GOTO;
1624         }
1625       while (gfc_match_char (',') == MATCH_YES);
1626
1627       if (gfc_match (")%t") != MATCH_YES)
1628         goto syntax;
1629
1630       if (head == NULL)
1631         {
1632            gfc_error (
1633                "Statement label list in GOTO at %C cannot be empty");
1634            goto syntax;
1635         }
1636       new_st.block = head;
1637
1638       return MATCH_YES;
1639     }
1640
1641   /* Last chance is a computed GO TO statement.  */
1642   if (gfc_match_char ('(') != MATCH_YES)
1643     {
1644       gfc_syntax_error (ST_GOTO);
1645       return MATCH_ERROR;
1646     }
1647
1648   head = tail = NULL;
1649   i = 1;
1650
1651   do
1652     {
1653       m = gfc_match_st_label (&label);
1654       if (m != MATCH_YES)
1655         goto syntax;
1656
1657       if (gfc_reference_st_label (label, ST_LABEL_TARGET) == FAILURE)
1658         goto cleanup;
1659
1660       if (head == NULL)
1661         head = tail = gfc_get_code ();
1662       else
1663         {
1664           tail->block = gfc_get_code ();
1665           tail = tail->block;
1666         }
1667
1668       cp = gfc_get_case ();
1669       cp->low = cp->high = gfc_int_expr (i++);
1670
1671       tail->op = EXEC_SELECT;
1672       tail->ext.case_list = cp;
1673
1674       tail->next = gfc_get_code ();
1675       tail->next->op = EXEC_GOTO;
1676       tail->next->label = label;
1677     }
1678   while (gfc_match_char (',') == MATCH_YES);
1679
1680   if (gfc_match_char (')') != MATCH_YES)
1681     goto syntax;
1682
1683   if (head == NULL)
1684     {
1685       gfc_error ("Statement label list in GOTO at %C cannot be empty");
1686       goto syntax;
1687     }
1688
1689   /* Get the rest of the statement.  */
1690   gfc_match_char (',');
1691
1692   if (gfc_match (" %e%t", &expr) != MATCH_YES)
1693     goto syntax;
1694
1695   /* At this point, a computed GOTO has been fully matched and an
1696      equivalent SELECT statement constructed.  */
1697
1698   new_st.op = EXEC_SELECT;
1699   new_st.expr = NULL;
1700
1701   /* Hack: For a "real" SELECT, the expression is in expr. We put
1702      it in expr2 so we can distinguish then and produce the correct
1703      diagnostics.  */
1704   new_st.expr2 = expr;
1705   new_st.block = head;
1706   return MATCH_YES;
1707
1708 syntax:
1709   gfc_syntax_error (ST_GOTO);
1710 cleanup:
1711   gfc_free_statements (head);
1712   return MATCH_ERROR;
1713 }
1714
1715
1716 /* Frees a list of gfc_alloc structures.  */
1717
1718 void
1719 gfc_free_alloc_list (gfc_alloc * p)
1720 {
1721   gfc_alloc *q;
1722
1723   for (; p; p = q)
1724     {
1725       q = p->next;
1726       gfc_free_expr (p->expr);
1727       gfc_free (p);
1728     }
1729 }
1730
1731
1732 /* Match an ALLOCATE statement.  */
1733
1734 match
1735 gfc_match_allocate (void)
1736 {
1737   gfc_alloc *head, *tail;
1738   gfc_expr *stat;
1739   match m;
1740
1741   head = tail = NULL;
1742   stat = NULL;
1743
1744   if (gfc_match_char ('(') != MATCH_YES)
1745     goto syntax;
1746
1747   for (;;)
1748     {
1749       if (head == NULL)
1750         head = tail = gfc_get_alloc ();
1751       else
1752         {
1753           tail->next = gfc_get_alloc ();
1754           tail = tail->next;
1755         }
1756
1757       m = gfc_match_variable (&tail->expr, 0);
1758       if (m == MATCH_NO)
1759         goto syntax;
1760       if (m == MATCH_ERROR)
1761         goto cleanup;
1762
1763       if (gfc_check_do_variable (tail->expr->symtree))
1764         goto cleanup;
1765
1766       if (gfc_pure (NULL)
1767           && gfc_impure_variable (tail->expr->symtree->n.sym))
1768         {
1769           gfc_error ("Bad allocate-object in ALLOCATE statement at %C for a "
1770                      "PURE procedure");
1771           goto cleanup;
1772         }
1773
1774       if (gfc_match_char (',') != MATCH_YES)
1775         break;
1776
1777       m = gfc_match (" stat = %v", &stat);
1778       if (m == MATCH_ERROR)
1779         goto cleanup;
1780       if (m == MATCH_YES)
1781         break;
1782     }
1783
1784   if (stat != NULL)
1785     {
1786       if (stat->symtree->n.sym->attr.intent == INTENT_IN)
1787         {
1788           gfc_error
1789             ("STAT variable '%s' of ALLOCATE statement at %C cannot be "
1790              "INTENT(IN)", stat->symtree->n.sym->name);
1791           goto cleanup;
1792         }
1793
1794       if (gfc_pure (NULL) && gfc_impure_variable (stat->symtree->n.sym))
1795         {
1796           gfc_error
1797             ("Illegal STAT variable in ALLOCATE statement at %C for a PURE "
1798              "procedure");
1799           goto cleanup;
1800         }
1801
1802       if (stat->symtree->n.sym->attr.flavor != FL_VARIABLE)
1803         {
1804           gfc_error("STAT expression at %C must be a variable");
1805           goto cleanup;
1806         }
1807
1808       gfc_check_do_variable(stat->symtree);
1809     }
1810
1811   if (gfc_match (" )%t") != MATCH_YES)
1812     goto syntax;
1813
1814   new_st.op = EXEC_ALLOCATE;
1815   new_st.expr = stat;
1816   new_st.ext.alloc_list = head;
1817
1818   return MATCH_YES;
1819
1820 syntax:
1821   gfc_syntax_error (ST_ALLOCATE);
1822
1823 cleanup:
1824   gfc_free_expr (stat);
1825   gfc_free_alloc_list (head);
1826   return MATCH_ERROR;
1827 }
1828
1829
1830 /* Match a NULLIFY statement. A NULLIFY statement is transformed into
1831    a set of pointer assignments to intrinsic NULL().  */
1832
1833 match
1834 gfc_match_nullify (void)
1835 {
1836   gfc_code *tail;
1837   gfc_expr *e, *p;
1838   match m;
1839
1840   tail = NULL;
1841
1842   if (gfc_match_char ('(') != MATCH_YES)
1843     goto syntax;
1844
1845   for (;;)
1846     {
1847       m = gfc_match_variable (&p, 0);
1848       if (m == MATCH_ERROR)
1849         goto cleanup;
1850       if (m == MATCH_NO)
1851         goto syntax;
1852
1853       if (gfc_check_do_variable(p->symtree))
1854         goto cleanup;
1855
1856       if (gfc_pure (NULL) && gfc_impure_variable (p->symtree->n.sym))
1857         {
1858           gfc_error
1859             ("Illegal variable in NULLIFY at %C for a PURE procedure");
1860           goto cleanup;
1861         }
1862
1863       /* build ' => NULL() ' */
1864       e = gfc_get_expr ();
1865       e->where = gfc_current_locus;
1866       e->expr_type = EXPR_NULL;
1867       e->ts.type = BT_UNKNOWN;
1868
1869       /* Chain to list */
1870       if (tail == NULL)
1871         tail = &new_st;
1872       else
1873         {
1874           tail->next = gfc_get_code ();
1875           tail = tail->next;
1876         }
1877
1878       tail->op = EXEC_POINTER_ASSIGN;
1879       tail->expr = p;
1880       tail->expr2 = e;
1881
1882       if (gfc_match (" )%t") == MATCH_YES)
1883         break;
1884       if (gfc_match_char (',') != MATCH_YES)
1885         goto syntax;
1886     }
1887
1888   return MATCH_YES;
1889
1890 syntax:
1891   gfc_syntax_error (ST_NULLIFY);
1892
1893 cleanup:
1894   gfc_free_statements (new_st.next);
1895   return MATCH_ERROR;
1896 }
1897
1898
1899 /* Match a DEALLOCATE statement.  */
1900
1901 match
1902 gfc_match_deallocate (void)
1903 {
1904   gfc_alloc *head, *tail;
1905   gfc_expr *stat;
1906   match m;
1907
1908   head = tail = NULL;
1909   stat = NULL;
1910
1911   if (gfc_match_char ('(') != MATCH_YES)
1912     goto syntax;
1913
1914   for (;;)
1915     {
1916       if (head == NULL)
1917         head = tail = gfc_get_alloc ();
1918       else
1919         {
1920           tail->next = gfc_get_alloc ();
1921           tail = tail->next;
1922         }
1923
1924       m = gfc_match_variable (&tail->expr, 0);
1925       if (m == MATCH_ERROR)
1926         goto cleanup;
1927       if (m == MATCH_NO)
1928         goto syntax;
1929
1930       if (gfc_check_do_variable (tail->expr->symtree))
1931         goto cleanup;
1932
1933       if (gfc_pure (NULL)
1934           && gfc_impure_variable (tail->expr->symtree->n.sym))
1935         {
1936           gfc_error
1937             ("Illegal deallocate-expression in DEALLOCATE at %C for a PURE "
1938              "procedure");
1939           goto cleanup;
1940         }
1941
1942       if (gfc_match_char (',') != MATCH_YES)
1943         break;
1944
1945       m = gfc_match (" stat = %v", &stat);
1946       if (m == MATCH_ERROR)
1947         goto cleanup;
1948       if (m == MATCH_YES)
1949         break;
1950     }
1951
1952   if (stat != NULL)
1953     {
1954       if (stat->symtree->n.sym->attr.intent == INTENT_IN)
1955         {
1956           gfc_error ("STAT variable '%s' of DEALLOCATE statement at %C "
1957                      "cannot be INTENT(IN)", stat->symtree->n.sym->name);
1958           goto cleanup;
1959         }
1960
1961       if (gfc_pure(NULL) && gfc_impure_variable (stat->symtree->n.sym))
1962         {
1963           gfc_error ("Illegal STAT variable in DEALLOCATE statement at %C "
1964                      "for a PURE procedure");
1965           goto cleanup;
1966         }
1967
1968       if (stat->symtree->n.sym->attr.flavor != FL_VARIABLE)
1969         {
1970           gfc_error("STAT expression at %C must be a variable");
1971           goto cleanup;
1972         }
1973
1974       gfc_check_do_variable(stat->symtree);
1975     }
1976
1977   if (gfc_match (" )%t") != MATCH_YES)
1978     goto syntax;
1979
1980   new_st.op = EXEC_DEALLOCATE;
1981   new_st.expr = stat;
1982   new_st.ext.alloc_list = head;
1983
1984   return MATCH_YES;
1985
1986 syntax:
1987   gfc_syntax_error (ST_DEALLOCATE);
1988
1989 cleanup:
1990   gfc_free_expr (stat);
1991   gfc_free_alloc_list (head);
1992   return MATCH_ERROR;
1993 }
1994
1995
1996 /* Match a RETURN statement.  */
1997
1998 match
1999 gfc_match_return (void)
2000 {
2001   gfc_expr *e;
2002   match m;
2003   gfc_compile_state s;
2004   int c;
2005
2006   e = NULL;
2007   if (gfc_match_eos () == MATCH_YES)
2008     goto done;
2009
2010   if (gfc_find_state (COMP_SUBROUTINE) == FAILURE)
2011     {
2012       gfc_error ("Alternate RETURN statement at %C is only allowed within "
2013                  "a SUBROUTINE");
2014       goto cleanup;
2015     }
2016
2017   if (gfc_current_form == FORM_FREE)
2018     {
2019       /* The following are valid, so we can't require a blank after the
2020         RETURN keyword:
2021           return+1
2022           return(1)  */
2023       c = gfc_peek_char ();
2024       if (ISALPHA (c) || ISDIGIT (c))
2025        return MATCH_NO;
2026     }
2027
2028   m = gfc_match (" %e%t", &e);
2029   if (m == MATCH_YES)
2030     goto done;
2031   if (m == MATCH_ERROR)
2032     goto cleanup;
2033
2034   gfc_syntax_error (ST_RETURN);
2035
2036 cleanup:
2037   gfc_free_expr (e);
2038   return MATCH_ERROR;
2039
2040 done:
2041   gfc_enclosing_unit (&s);
2042   if (s == COMP_PROGRAM
2043       && gfc_notify_std (GFC_STD_GNU, "Extension: RETURN statement in "
2044                         "main program at %C") == FAILURE)
2045       return MATCH_ERROR;
2046
2047   new_st.op = EXEC_RETURN;
2048   new_st.expr = e;
2049
2050   return MATCH_YES;
2051 }
2052
2053
2054 /* Match a CALL statement.  The tricky part here are possible
2055    alternate return specifiers.  We handle these by having all
2056    "subroutines" actually return an integer via a register that gives
2057    the return number.  If the call specifies alternate returns, we
2058    generate code for a SELECT statement whose case clauses contain
2059    GOTOs to the various labels.  */
2060
2061 match
2062 gfc_match_call (void)
2063 {
2064   char name[GFC_MAX_SYMBOL_LEN + 1];
2065   gfc_actual_arglist *a, *arglist;
2066   gfc_case *new_case;
2067   gfc_symbol *sym;
2068   gfc_symtree *st;
2069   gfc_code *c;
2070   match m;
2071   int i;
2072
2073   arglist = NULL;
2074
2075   m = gfc_match ("% %n", name);
2076   if (m == MATCH_NO)
2077     goto syntax;
2078   if (m != MATCH_YES)
2079     return m;
2080
2081   if (gfc_get_ha_sym_tree (name, &st))
2082     return MATCH_ERROR;
2083
2084   sym = st->n.sym;
2085   gfc_set_sym_referenced (sym);
2086
2087   if (!sym->attr.generic
2088       && !sym->attr.subroutine
2089       && gfc_add_subroutine (&sym->attr, sym->name, NULL) == FAILURE)
2090     return MATCH_ERROR;
2091
2092   if (gfc_match_eos () != MATCH_YES)
2093     {
2094       m = gfc_match_actual_arglist (1, &arglist);
2095       if (m == MATCH_NO)
2096         goto syntax;
2097       if (m == MATCH_ERROR)
2098         goto cleanup;
2099
2100       if (gfc_match_eos () != MATCH_YES)
2101         goto syntax;
2102     }
2103
2104   /* If any alternate return labels were found, construct a SELECT
2105      statement that will jump to the right place.  */
2106
2107   i = 0;
2108   for (a = arglist; a; a = a->next)
2109     if (a->expr == NULL)
2110         i = 1;
2111
2112   if (i)
2113     {
2114       gfc_symtree *select_st;
2115       gfc_symbol *select_sym;
2116       char name[GFC_MAX_SYMBOL_LEN + 1];
2117
2118       new_st.next = c = gfc_get_code ();
2119       c->op = EXEC_SELECT;
2120       sprintf (name, "_result_%s",sym->name);
2121       gfc_get_ha_sym_tree (name, &select_st);  /* Can't fail */
2122
2123       select_sym = select_st->n.sym;
2124       select_sym->ts.type = BT_INTEGER;
2125       select_sym->ts.kind = gfc_default_integer_kind;
2126       gfc_set_sym_referenced (select_sym);
2127       c->expr = gfc_get_expr ();
2128       c->expr->expr_type = EXPR_VARIABLE;
2129       c->expr->symtree = select_st;
2130       c->expr->ts = select_sym->ts;
2131       c->expr->where = gfc_current_locus;
2132
2133       i = 0;
2134       for (a = arglist; a; a = a->next)
2135         {
2136           if (a->expr != NULL)
2137             continue;
2138
2139           if (gfc_reference_st_label (a->label, ST_LABEL_TARGET) == FAILURE)
2140             continue;
2141
2142           i++;
2143
2144           c->block = gfc_get_code ();
2145           c = c->block;
2146           c->op = EXEC_SELECT;
2147
2148           new_case = gfc_get_case ();
2149           new_case->high = new_case->low = gfc_int_expr (i);
2150           c->ext.case_list = new_case;
2151
2152           c->next = gfc_get_code ();
2153           c->next->op = EXEC_GOTO;
2154           c->next->label = a->label;
2155         }
2156     }
2157
2158   new_st.op = EXEC_CALL;
2159   new_st.symtree = st;
2160   new_st.ext.actual = arglist;
2161
2162   return MATCH_YES;
2163
2164 syntax:
2165   gfc_syntax_error (ST_CALL);
2166
2167 cleanup:
2168   gfc_free_actual_arglist (arglist);
2169   return MATCH_ERROR;
2170 }
2171
2172
2173 /* Given a name, return a pointer to the common head structure,
2174    creating it if it does not exist. If FROM_MODULE is nonzero, we
2175    mangle the name so that it doesn't interfere with commons defined 
2176    in the using namespace.
2177    TODO: Add to global symbol tree.  */
2178
2179 gfc_common_head *
2180 gfc_get_common (const char *name, int from_module)
2181 {
2182   gfc_symtree *st;
2183   static int serial = 0;
2184   char mangled_name[GFC_MAX_SYMBOL_LEN+1];
2185
2186   if (from_module)
2187     {
2188       /* A use associated common block is only needed to correctly layout
2189          the variables it contains.  */
2190       snprintf(mangled_name, GFC_MAX_SYMBOL_LEN, "_%d_%s", serial++, name);
2191       st = gfc_new_symtree (&gfc_current_ns->common_root, mangled_name);
2192     }
2193   else
2194     {
2195       st = gfc_find_symtree (gfc_current_ns->common_root, name);
2196
2197       if (st == NULL)
2198         st = gfc_new_symtree (&gfc_current_ns->common_root, name);
2199     }
2200
2201   if (st->n.common == NULL)
2202     {
2203       st->n.common = gfc_get_common_head ();
2204       st->n.common->where = gfc_current_locus;
2205       strcpy (st->n.common->name, name);
2206     }
2207
2208   return st->n.common;
2209 }
2210
2211
2212 /* Match a common block name.  */
2213
2214 static match
2215 match_common_name (char *name)
2216 {
2217   match m;
2218
2219   if (gfc_match_char ('/') == MATCH_NO)
2220     {
2221       name[0] = '\0';
2222       return MATCH_YES;
2223     }
2224
2225   if (gfc_match_char ('/') == MATCH_YES)
2226     {
2227       name[0] = '\0';
2228       return MATCH_YES;
2229     }
2230
2231   m = gfc_match_name (name);
2232
2233   if (m == MATCH_ERROR)
2234     return MATCH_ERROR;
2235   if (m == MATCH_YES && gfc_match_char ('/') == MATCH_YES)
2236     return MATCH_YES;
2237
2238   gfc_error ("Syntax error in common block name at %C");
2239   return MATCH_ERROR;
2240 }
2241
2242
2243 /* Match a COMMON statement.  */
2244
2245 match
2246 gfc_match_common (void)
2247 {
2248   gfc_symbol *sym, **head, *tail, *other, *old_blank_common;
2249   char name[GFC_MAX_SYMBOL_LEN+1];
2250   gfc_common_head *t;
2251   gfc_array_spec *as;
2252   gfc_equiv * e1, * e2;
2253   match m;
2254   gfc_gsymbol *gsym;
2255
2256   old_blank_common = gfc_current_ns->blank_common.head;
2257   if (old_blank_common)
2258     {
2259       while (old_blank_common->common_next)
2260         old_blank_common = old_blank_common->common_next;
2261     }
2262
2263   as = NULL;
2264
2265   for (;;)
2266     {
2267       m = match_common_name (name);
2268       if (m == MATCH_ERROR)
2269         goto cleanup;
2270
2271       gsym = gfc_get_gsymbol (name);
2272       if (gsym->type != GSYM_UNKNOWN && gsym->type != GSYM_COMMON)
2273         {
2274           gfc_error ("Symbol '%s' at %C is already an external symbol that is not COMMON",
2275                      sym->name);
2276           goto cleanup;
2277         }
2278
2279       if (gsym->type == GSYM_UNKNOWN)
2280         {
2281           gsym->type = GSYM_COMMON;
2282           gsym->where = gfc_current_locus;
2283           gsym->defined = 1;
2284         }
2285
2286       gsym->used = 1;
2287
2288       if (name[0] == '\0')
2289         {
2290           t = &gfc_current_ns->blank_common;
2291           if (t->head == NULL)
2292             t->where = gfc_current_locus;
2293           head = &t->head;
2294         }
2295       else
2296         {
2297           t = gfc_get_common (name, 0);
2298           head = &t->head;
2299         }
2300
2301       if (*head == NULL)
2302         tail = NULL;
2303       else
2304         {
2305           tail = *head;
2306           while (tail->common_next)
2307             tail = tail->common_next;
2308         }
2309
2310       /* Grab the list of symbols.  */
2311       for (;;)
2312         {
2313           m = gfc_match_symbol (&sym, 0);
2314           if (m == MATCH_ERROR)
2315             goto cleanup;
2316           if (m == MATCH_NO)
2317             goto syntax;
2318
2319           if (sym->attr.in_common)
2320             {
2321               gfc_error ("Symbol '%s' at %C is already in a COMMON block",
2322                          sym->name);
2323               goto cleanup;
2324             }
2325
2326           if (gfc_add_in_common (&sym->attr, sym->name, NULL) == FAILURE) 
2327             goto cleanup;
2328
2329           if (sym->value != NULL
2330               && (name[0] == '\0' || !sym->attr.data))
2331             {
2332               if (name[0] == '\0')
2333                 gfc_error ("Previously initialized symbol '%s' in "
2334                            "blank COMMON block at %C", sym->name);
2335               else
2336                 gfc_error ("Previously initialized symbol '%s' in "
2337                            "COMMON block '%s' at %C", sym->name, name);
2338               goto cleanup;
2339             }
2340
2341           if (gfc_add_in_common (&sym->attr, sym->name, NULL) == FAILURE)
2342             goto cleanup;
2343
2344           /* Derived type names must have the SEQUENCE attribute.  */
2345           if (sym->ts.type == BT_DERIVED && !sym->ts.derived->attr.sequence)
2346             {
2347               gfc_error
2348                 ("Derived type variable in COMMON at %C does not have the "
2349                  "SEQUENCE attribute");
2350               goto cleanup;
2351             }
2352
2353           if (tail != NULL)
2354             tail->common_next = sym;
2355           else
2356             *head = sym;
2357
2358           tail = sym;
2359
2360           /* Deal with an optional array specification after the
2361              symbol name.  */
2362           m = gfc_match_array_spec (&as);
2363           if (m == MATCH_ERROR)
2364             goto cleanup;
2365
2366           if (m == MATCH_YES)
2367             {
2368               if (as->type != AS_EXPLICIT)
2369                 {
2370                   gfc_error
2371                     ("Array specification for symbol '%s' in COMMON at %C "
2372                      "must be explicit", sym->name);
2373                   goto cleanup;
2374                 }
2375
2376               if (gfc_add_dimension (&sym->attr, sym->name, NULL) == FAILURE)
2377                 goto cleanup;
2378
2379               if (sym->attr.pointer)
2380                 {
2381                   gfc_error
2382                     ("Symbol '%s' in COMMON at %C cannot be a POINTER array",
2383                      sym->name);
2384                   goto cleanup;
2385                 }
2386
2387               sym->as = as;
2388               as = NULL;
2389
2390             }
2391
2392           sym->common_head = t;
2393
2394           /* Check to see if the symbol is already in an equivalence group.
2395              If it is, set the other members as being in common.  */
2396           if (sym->attr.in_equivalence)
2397             {
2398               for (e1 = gfc_current_ns->equiv; e1; e1 = e1->next)
2399                 {
2400                   for (e2 = e1; e2; e2 = e2->eq)
2401                     if (e2->expr->symtree->n.sym == sym)
2402                       goto equiv_found;
2403
2404                   continue;
2405
2406           equiv_found:
2407
2408                   for (e2 = e1; e2; e2 = e2->eq)
2409                     {
2410                       other = e2->expr->symtree->n.sym;
2411                       if (other->common_head
2412                             && other->common_head != sym->common_head)
2413                         {
2414                           gfc_error ("Symbol '%s', in COMMON block '%s' at "
2415                                      "%C is being indirectly equivalenced to "
2416                                      "another COMMON block '%s'",
2417                                      sym->name,
2418                                      sym->common_head->name,
2419                                      other->common_head->name);
2420                             goto cleanup;
2421                         }
2422                       other->attr.in_common = 1;
2423                       other->common_head = t;
2424                     }
2425                 }
2426             }
2427
2428
2429           gfc_gobble_whitespace ();
2430           if (gfc_match_eos () == MATCH_YES)
2431             goto done;
2432           if (gfc_peek_char () == '/')
2433             break;
2434           if (gfc_match_char (',') != MATCH_YES)
2435             goto syntax;
2436           gfc_gobble_whitespace ();
2437           if (gfc_peek_char () == '/')
2438             break;
2439         }
2440     }
2441
2442 done:
2443   return MATCH_YES;
2444
2445 syntax:
2446   gfc_syntax_error (ST_COMMON);
2447
2448 cleanup:
2449   if (old_blank_common)
2450     old_blank_common->common_next = NULL;
2451   else
2452     gfc_current_ns->blank_common.head = NULL;
2453   gfc_free_array_spec (as);
2454   return MATCH_ERROR;
2455 }
2456
2457
2458 /* Match a BLOCK DATA program unit.  */
2459
2460 match
2461 gfc_match_block_data (void)
2462 {
2463   char name[GFC_MAX_SYMBOL_LEN + 1];
2464   gfc_symbol *sym;
2465   match m;
2466
2467   if (gfc_match_eos () == MATCH_YES)
2468     {
2469       gfc_new_block = NULL;
2470       return MATCH_YES;
2471     }
2472
2473   m = gfc_match ("% %n%t", name);
2474   if (m != MATCH_YES)
2475     return MATCH_ERROR;
2476
2477   if (gfc_get_symbol (name, NULL, &sym))
2478     return MATCH_ERROR;
2479
2480   if (gfc_add_flavor (&sym->attr, FL_BLOCK_DATA, sym->name, NULL) == FAILURE)
2481     return MATCH_ERROR;
2482
2483   gfc_new_block = sym;
2484
2485   return MATCH_YES;
2486 }
2487
2488
2489 /* Free a namelist structure.  */
2490
2491 void
2492 gfc_free_namelist (gfc_namelist * name)
2493 {
2494   gfc_namelist *n;
2495
2496   for (; name; name = n)
2497     {
2498       n = name->next;
2499       gfc_free (name);
2500     }
2501 }
2502
2503
2504 /* Match a NAMELIST statement.  */
2505
2506 match
2507 gfc_match_namelist (void)
2508 {
2509   gfc_symbol *group_name, *sym;
2510   gfc_namelist *nl;
2511   match m, m2;
2512
2513   m = gfc_match (" / %s /", &group_name);
2514   if (m == MATCH_NO)
2515     goto syntax;
2516   if (m == MATCH_ERROR)
2517     goto error;
2518
2519   for (;;)
2520     {
2521       if (group_name->ts.type != BT_UNKNOWN)
2522         {
2523           gfc_error
2524             ("Namelist group name '%s' at %C already has a basic type "
2525              "of %s", group_name->name, gfc_typename (&group_name->ts));
2526           return MATCH_ERROR;
2527         }
2528
2529       if (group_name->attr.flavor == FL_NAMELIST
2530             && group_name->attr.use_assoc
2531             && gfc_notify_std (GFC_STD_GNU, "Namelist group name '%s' "
2532                                "at %C already is USE associated and can"
2533                                "not be respecified.", group_name->name)
2534                  == FAILURE)
2535         return MATCH_ERROR;
2536
2537       if (group_name->attr.flavor != FL_NAMELIST
2538           && gfc_add_flavor (&group_name->attr, FL_NAMELIST,
2539                              group_name->name, NULL) == FAILURE)
2540         return MATCH_ERROR;
2541
2542       for (;;)
2543         {
2544           m = gfc_match_symbol (&sym, 1);
2545           if (m == MATCH_NO)
2546             goto syntax;
2547           if (m == MATCH_ERROR)
2548             goto error;
2549
2550           if (sym->attr.in_namelist == 0
2551               && gfc_add_in_namelist (&sym->attr, sym->name, NULL) == FAILURE)
2552             goto error;
2553
2554           /* Use gfc_error_check here, rather than goto error, so that this
2555              these are the only errors for the next two lines.  */
2556           if (sym->as && sym->as->type == AS_ASSUMED_SIZE)
2557             {
2558               gfc_error ("Assumed size array '%s' in namelist '%s'at "
2559                          "%C is not allowed.", sym->name, group_name->name);
2560               gfc_error_check ();
2561             }
2562
2563           if (sym->as && sym->as->type == AS_ASSUMED_SHAPE
2564                 && gfc_notify_std (GFC_STD_GNU, "Assumed shape array '%s' in "
2565                                    "namelist '%s' at %C is an extension.",
2566                                    sym->name, group_name->name) == FAILURE)
2567             gfc_error_check ();
2568
2569           nl = gfc_get_namelist ();
2570           nl->sym = sym;
2571
2572           if (group_name->namelist == NULL)
2573             group_name->namelist = group_name->namelist_tail = nl;
2574           else
2575             {
2576               group_name->namelist_tail->next = nl;
2577               group_name->namelist_tail = nl;
2578             }
2579
2580           if (gfc_match_eos () == MATCH_YES)
2581             goto done;
2582
2583           m = gfc_match_char (',');
2584
2585           if (gfc_match_char ('/') == MATCH_YES)
2586             {
2587               m2 = gfc_match (" %s /", &group_name);
2588               if (m2 == MATCH_YES)
2589                 break;
2590               if (m2 == MATCH_ERROR)
2591                 goto error;
2592               goto syntax;
2593             }
2594
2595           if (m != MATCH_YES)
2596             goto syntax;
2597         }
2598     }
2599
2600 done:
2601   return MATCH_YES;
2602
2603 syntax:
2604   gfc_syntax_error (ST_NAMELIST);
2605
2606 error:
2607   return MATCH_ERROR;
2608 }
2609
2610
2611 /* Match a MODULE statement.  */
2612
2613 match
2614 gfc_match_module (void)
2615 {
2616   match m;
2617
2618   m = gfc_match (" %s%t", &gfc_new_block);
2619   if (m != MATCH_YES)
2620     return m;
2621
2622   if (gfc_add_flavor (&gfc_new_block->attr, FL_MODULE,
2623                       gfc_new_block->name, NULL) == FAILURE)
2624     return MATCH_ERROR;
2625
2626   return MATCH_YES;
2627 }
2628
2629
2630 /* Free equivalence sets and lists.  Recursively is the easiest way to
2631    do this.  */
2632
2633 void
2634 gfc_free_equiv (gfc_equiv * eq)
2635 {
2636
2637   if (eq == NULL)
2638     return;
2639
2640   gfc_free_equiv (eq->eq);
2641   gfc_free_equiv (eq->next);
2642
2643   gfc_free_expr (eq->expr);
2644   gfc_free (eq);
2645 }
2646
2647
2648 /* Match an EQUIVALENCE statement.  */
2649
2650 match
2651 gfc_match_equivalence (void)
2652 {
2653   gfc_equiv *eq, *set, *tail;
2654   gfc_ref *ref;
2655   gfc_symbol *sym;
2656   match m;
2657   gfc_common_head *common_head = NULL;
2658   bool common_flag;
2659   int cnt;
2660
2661   tail = NULL;
2662
2663   for (;;)
2664     {
2665       eq = gfc_get_equiv ();
2666       if (tail == NULL)
2667         tail = eq;
2668
2669       eq->next = gfc_current_ns->equiv;
2670       gfc_current_ns->equiv = eq;
2671
2672       if (gfc_match_char ('(') != MATCH_YES)
2673         goto syntax;
2674
2675       set = eq;
2676       common_flag = FALSE;
2677       cnt = 0;
2678
2679       for (;;)
2680         {
2681           m = gfc_match_equiv_variable (&set->expr);
2682           if (m == MATCH_ERROR)
2683             goto cleanup;
2684           if (m == MATCH_NO)
2685             goto syntax;
2686
2687           /*  count the number of objects.  */
2688           cnt++;
2689
2690           if (gfc_match_char ('%') == MATCH_YES)
2691             {
2692               gfc_error ("Derived type component %C is not a "
2693                          "permitted EQUIVALENCE member");
2694               goto cleanup;
2695             }
2696
2697           for (ref = set->expr->ref; ref; ref = ref->next)
2698             if (ref->type == REF_ARRAY && ref->u.ar.type == AR_SECTION)
2699               {
2700                 gfc_error
2701                   ("Array reference in EQUIVALENCE at %C cannot be an "
2702                    "array section");
2703                 goto cleanup;
2704               }
2705
2706           sym = set->expr->symtree->n.sym;
2707
2708           if (gfc_add_in_equivalence (&sym->attr, sym->name, NULL)
2709                 == FAILURE)
2710             goto cleanup;
2711
2712           if (sym->attr.in_common)
2713             {
2714               common_flag = TRUE;
2715               common_head = sym->common_head;
2716             }
2717
2718           if (gfc_match_char (')') == MATCH_YES)
2719             break;
2720
2721           if (gfc_match_char (',') != MATCH_YES)
2722             goto syntax;
2723
2724           set->eq = gfc_get_equiv ();
2725           set = set->eq;
2726         }
2727
2728       if (cnt < 2)
2729         {
2730           gfc_error ("EQUIVALENCE at %C requires two or more objects");
2731           goto cleanup;
2732         }
2733
2734       /* If one of the members of an equivalence is in common, then
2735          mark them all as being in common.  Before doing this, check
2736          that members of the equivalence group are not in different
2737          common blocks. */
2738       if (common_flag)
2739         for (set = eq; set; set = set->eq)
2740           {
2741             sym = set->expr->symtree->n.sym;
2742             if (sym->common_head && sym->common_head != common_head)
2743               {
2744                 gfc_error ("Attempt to indirectly overlap COMMON "
2745                            "blocks %s and %s by EQUIVALENCE at %C",
2746                            sym->common_head->name,
2747                            common_head->name);
2748                 goto cleanup;
2749               }
2750             sym->attr.in_common = 1;
2751             sym->common_head = common_head;
2752           }
2753
2754       if (gfc_match_eos () == MATCH_YES)
2755         break;
2756       if (gfc_match_char (',') != MATCH_YES)
2757         goto syntax;
2758     }
2759
2760   return MATCH_YES;
2761
2762 syntax:
2763   gfc_syntax_error (ST_EQUIVALENCE);
2764
2765 cleanup:
2766   eq = tail->next;
2767   tail->next = NULL;
2768
2769   gfc_free_equiv (gfc_current_ns->equiv);
2770   gfc_current_ns->equiv = eq;
2771
2772   return MATCH_ERROR;
2773 }
2774
2775 /* Check that a statement function is not recursive. This is done by looking
2776    for the statement function symbol(sym) by looking recursively through its
2777    expression(e).  If a reference to sym is found, true is returned.  */
2778 static bool
2779 recursive_stmt_fcn (gfc_expr *e, gfc_symbol *sym)
2780 {
2781   gfc_actual_arglist *arg;
2782   gfc_ref *ref;
2783   int i;
2784
2785   if (e == NULL)
2786     return false;
2787
2788   switch (e->expr_type)
2789     {
2790     case EXPR_FUNCTION:
2791       for (arg = e->value.function.actual; arg; arg = arg->next)
2792         {
2793           if (sym->name == arg->name
2794                 || recursive_stmt_fcn (arg->expr, sym))
2795             return true;
2796         }
2797
2798       if (e->symtree == NULL)
2799         return false;
2800
2801       /* Check the name before testing for nested recursion!  */
2802       if (sym->name == e->symtree->n.sym->name)
2803         return true;
2804
2805       /* Catch recursion via other statement functions.  */
2806       if (e->symtree->n.sym->attr.proc == PROC_ST_FUNCTION
2807             && e->symtree->n.sym->value
2808             && recursive_stmt_fcn (e->symtree->n.sym->value, sym))
2809         return true;
2810
2811       break;
2812
2813     case EXPR_VARIABLE:
2814       if (e->symtree && sym->name == e->symtree->n.sym->name)
2815         return true;
2816       break;
2817
2818     case EXPR_OP:
2819       if (recursive_stmt_fcn (e->value.op.op1, sym)
2820             || recursive_stmt_fcn (e->value.op.op2, sym))
2821         return true;
2822       break;
2823
2824     default:
2825       break;
2826     }
2827
2828   /* Component references do not need to be checked.  */
2829   if (e->ref)
2830     {
2831       for (ref = e->ref; ref; ref = ref->next)
2832         {
2833           switch (ref->type)
2834             {
2835             case REF_ARRAY:
2836               for (i = 0; i < ref->u.ar.dimen; i++)
2837                 {
2838                   if (recursive_stmt_fcn (ref->u.ar.start[i], sym)
2839                         || recursive_stmt_fcn (ref->u.ar.end[i], sym)
2840                         || recursive_stmt_fcn (ref->u.ar.stride[i], sym))
2841                     return true;
2842                 }
2843               break;
2844
2845             case REF_SUBSTRING:
2846               if (recursive_stmt_fcn (ref->u.ss.start, sym)
2847                     || recursive_stmt_fcn (ref->u.ss.end, sym))
2848                 return true;
2849
2850               break;
2851
2852             default:
2853               break;
2854             }
2855         }
2856     }
2857   return false;
2858 }
2859
2860
2861 /* Match a statement function declaration.  It is so easy to match
2862    non-statement function statements with a MATCH_ERROR as opposed to
2863    MATCH_NO that we suppress error message in most cases.  */
2864
2865 match
2866 gfc_match_st_function (void)
2867 {
2868   gfc_error_buf old_error;
2869   gfc_symbol *sym;
2870   gfc_expr *expr;
2871   match m;
2872
2873   m = gfc_match_symbol (&sym, 0);
2874   if (m != MATCH_YES)
2875     return m;
2876
2877   gfc_push_error (&old_error);
2878
2879   if (gfc_add_procedure (&sym->attr, PROC_ST_FUNCTION,
2880                          sym->name, NULL) == FAILURE)
2881     goto undo_error;
2882
2883   if (gfc_match_formal_arglist (sym, 1, 0) != MATCH_YES)
2884     goto undo_error;
2885
2886   m = gfc_match (" = %e%t", &expr);
2887   if (m == MATCH_NO)
2888     goto undo_error;
2889
2890   gfc_free_error (&old_error);
2891   if (m == MATCH_ERROR)
2892     return m;
2893
2894   if (recursive_stmt_fcn (expr, sym))
2895     {
2896       gfc_error ("Statement function at %L is recursive",
2897                  &expr->where);
2898       return MATCH_ERROR;
2899     }
2900
2901   sym->value = expr;
2902
2903   return MATCH_YES;
2904
2905 undo_error:
2906   gfc_pop_error (&old_error);
2907   return MATCH_NO;
2908 }
2909
2910
2911 /***************** SELECT CASE subroutines ******************/
2912
2913 /* Free a single case structure.  */
2914
2915 static void
2916 free_case (gfc_case * p)
2917 {
2918   if (p->low == p->high)
2919     p->high = NULL;
2920   gfc_free_expr (p->low);
2921   gfc_free_expr (p->high);
2922   gfc_free (p);
2923 }
2924
2925
2926 /* Free a list of case structures.  */
2927
2928 void
2929 gfc_free_case_list (gfc_case * p)
2930 {
2931   gfc_case *q;
2932
2933   for (; p; p = q)
2934     {
2935       q = p->next;
2936       free_case (p);
2937     }
2938 }
2939
2940
2941 /* Match a single case selector.  */
2942
2943 static match
2944 match_case_selector (gfc_case ** cp)
2945 {
2946   gfc_case *c;
2947   match m;
2948
2949   c = gfc_get_case ();
2950   c->where = gfc_current_locus;
2951
2952   if (gfc_match_char (':') == MATCH_YES)
2953     {
2954       m = gfc_match_init_expr (&c->high);
2955       if (m == MATCH_NO)
2956         goto need_expr;
2957       if (m == MATCH_ERROR)
2958         goto cleanup;
2959     }
2960
2961   else
2962     {
2963       m = gfc_match_init_expr (&c->low);
2964       if (m == MATCH_ERROR)
2965         goto cleanup;
2966       if (m == MATCH_NO)
2967         goto need_expr;
2968
2969       /* If we're not looking at a ':' now, make a range out of a single
2970          target.  Else get the upper bound for the case range.  */
2971       if (gfc_match_char (':') != MATCH_YES)
2972         c->high = c->low;
2973       else
2974         {
2975           m = gfc_match_init_expr (&c->high);
2976           if (m == MATCH_ERROR)
2977             goto cleanup;
2978           /* MATCH_NO is fine.  It's OK if nothing is there!  */
2979         }
2980     }
2981
2982   *cp = c;
2983   return MATCH_YES;
2984
2985 need_expr:
2986   gfc_error ("Expected initialization expression in CASE at %C");
2987
2988 cleanup:
2989   free_case (c);
2990   return MATCH_ERROR;
2991 }
2992
2993
2994 /* Match the end of a case statement.  */
2995
2996 static match
2997 match_case_eos (void)
2998 {
2999   char name[GFC_MAX_SYMBOL_LEN + 1];
3000   match m;
3001
3002   if (gfc_match_eos () == MATCH_YES)
3003     return MATCH_YES;
3004
3005   gfc_gobble_whitespace ();
3006
3007   m = gfc_match_name (name);
3008   if (m != MATCH_YES)
3009     return m;
3010
3011   if (strcmp (name, gfc_current_block ()->name) != 0)
3012     {
3013       gfc_error ("Expected case name of '%s' at %C",
3014                  gfc_current_block ()->name);
3015       return MATCH_ERROR;
3016     }
3017
3018   return gfc_match_eos ();
3019 }
3020
3021
3022 /* Match a SELECT statement.  */
3023
3024 match
3025 gfc_match_select (void)
3026 {
3027   gfc_expr *expr;
3028   match m;
3029
3030   m = gfc_match_label ();
3031   if (m == MATCH_ERROR)
3032     return m;
3033
3034   m = gfc_match (" select case ( %e )%t", &expr);
3035   if (m != MATCH_YES)
3036     return m;
3037
3038   new_st.op = EXEC_SELECT;
3039   new_st.expr = expr;
3040
3041   return MATCH_YES;
3042 }
3043
3044
3045 /* Match a CASE statement.  */
3046
3047 match
3048 gfc_match_case (void)
3049 {
3050   gfc_case *c, *head, *tail;
3051   match m;
3052
3053   head = tail = NULL;
3054
3055   if (gfc_current_state () != COMP_SELECT)
3056     {
3057       gfc_error ("Unexpected CASE statement at %C");
3058       return MATCH_ERROR;
3059     }
3060
3061   if (gfc_match ("% default") == MATCH_YES)
3062     {
3063       m = match_case_eos ();
3064       if (m == MATCH_NO)
3065         goto syntax;
3066       if (m == MATCH_ERROR)
3067         goto cleanup;
3068
3069       new_st.op = EXEC_SELECT;
3070       c = gfc_get_case ();
3071       c->where = gfc_current_locus;
3072       new_st.ext.case_list = c;
3073       return MATCH_YES;
3074     }
3075
3076   if (gfc_match_char ('(') != MATCH_YES)
3077     goto syntax;
3078
3079   for (;;)
3080     {
3081       if (match_case_selector (&c) == MATCH_ERROR)
3082         goto cleanup;
3083
3084       if (head == NULL)
3085         head = c;
3086       else
3087         tail->next = c;
3088
3089       tail = c;
3090
3091       if (gfc_match_char (')') == MATCH_YES)
3092         break;
3093       if (gfc_match_char (',') != MATCH_YES)
3094         goto syntax;
3095     }
3096
3097   m = match_case_eos ();
3098   if (m == MATCH_NO)
3099     goto syntax;
3100   if (m == MATCH_ERROR)
3101     goto cleanup;
3102
3103   new_st.op = EXEC_SELECT;
3104   new_st.ext.case_list = head;
3105
3106   return MATCH_YES;
3107
3108 syntax:
3109   gfc_error ("Syntax error in CASE-specification at %C");
3110
3111 cleanup:
3112   gfc_free_case_list (head);  /* new_st is cleaned up in parse.c.  */
3113   return MATCH_ERROR;
3114 }
3115
3116 /********************* WHERE subroutines ********************/
3117
3118 /* Match the rest of a simple WHERE statement that follows an IF statement.  
3119  */
3120
3121 static match
3122 match_simple_where (void)
3123 {
3124   gfc_expr *expr;
3125   gfc_code *c;
3126   match m;
3127
3128   m = gfc_match (" ( %e )", &expr);
3129   if (m != MATCH_YES)
3130     return m;
3131
3132   m = gfc_match_assignment ();
3133   if (m == MATCH_NO)
3134     goto syntax;
3135   if (m == MATCH_ERROR)
3136     goto cleanup;
3137
3138   if (gfc_match_eos () != MATCH_YES)
3139     goto syntax;
3140
3141   c = gfc_get_code ();
3142
3143   c->op = EXEC_WHERE;
3144   c->expr = expr;
3145   c->next = gfc_get_code ();
3146
3147   *c->next = new_st;
3148   gfc_clear_new_st ();
3149
3150   new_st.op = EXEC_WHERE;
3151   new_st.block = c;
3152
3153   return MATCH_YES;
3154
3155 syntax:
3156   gfc_syntax_error (ST_WHERE);
3157
3158 cleanup:
3159   gfc_free_expr (expr);
3160   return MATCH_ERROR;
3161 }
3162
3163 /* Match a WHERE statement.  */
3164
3165 match
3166 gfc_match_where (gfc_statement * st)
3167 {
3168   gfc_expr *expr;
3169   match m0, m;
3170   gfc_code *c;
3171
3172   m0 = gfc_match_label ();
3173   if (m0 == MATCH_ERROR)
3174     return m0;
3175
3176   m = gfc_match (" where ( %e )", &expr);
3177   if (m != MATCH_YES)
3178     return m;
3179
3180   if (gfc_match_eos () == MATCH_YES)
3181     {
3182       *st = ST_WHERE_BLOCK;
3183
3184       new_st.op = EXEC_WHERE;
3185       new_st.expr = expr;
3186       return MATCH_YES;
3187     }
3188
3189   m = gfc_match_assignment ();
3190   if (m == MATCH_NO)
3191     gfc_syntax_error (ST_WHERE);
3192
3193   if (m != MATCH_YES)
3194     {
3195       gfc_free_expr (expr);
3196       return MATCH_ERROR;
3197     }
3198
3199   /* We've got a simple WHERE statement.  */
3200   *st = ST_WHERE;
3201   c = gfc_get_code ();
3202
3203   c->op = EXEC_WHERE;
3204   c->expr = expr;
3205   c->next = gfc_get_code ();
3206
3207   *c->next = new_st;
3208   gfc_clear_new_st ();
3209
3210   new_st.op = EXEC_WHERE;
3211   new_st.block = c;
3212
3213   return MATCH_YES;
3214 }
3215
3216
3217 /* Match an ELSEWHERE statement.  We leave behind a WHERE node in
3218    new_st if successful.  */
3219
3220 match
3221 gfc_match_elsewhere (void)
3222 {
3223   char name[GFC_MAX_SYMBOL_LEN + 1];
3224   gfc_expr *expr;
3225   match m;
3226
3227   if (gfc_current_state () != COMP_WHERE)
3228     {
3229       gfc_error ("ELSEWHERE statement at %C not enclosed in WHERE block");
3230       return MATCH_ERROR;
3231     }
3232
3233   expr = NULL;
3234
3235   if (gfc_match_char ('(') == MATCH_YES)
3236     {
3237       m = gfc_match_expr (&expr);
3238       if (m == MATCH_NO)
3239         goto syntax;
3240       if (m == MATCH_ERROR)
3241         return MATCH_ERROR;
3242
3243       if (gfc_match_char (')') != MATCH_YES)
3244         goto syntax;
3245     }
3246
3247   if (gfc_match_eos () != MATCH_YES)
3248     {                           /* Better be a name at this point */
3249       m = gfc_match_name (name);
3250       if (m == MATCH_NO)
3251         goto syntax;
3252       if (m == MATCH_ERROR)
3253         goto cleanup;
3254
3255       if (gfc_match_eos () != MATCH_YES)
3256         goto syntax;
3257
3258       if (strcmp (name, gfc_current_block ()->name) != 0)
3259         {
3260           gfc_error ("Label '%s' at %C doesn't match WHERE label '%s'",
3261                      name, gfc_current_block ()->name);
3262           goto cleanup;
3263         }
3264     }
3265
3266   new_st.op = EXEC_WHERE;
3267   new_st.expr = expr;
3268   return MATCH_YES;
3269
3270 syntax:
3271   gfc_syntax_error (ST_ELSEWHERE);
3272
3273 cleanup:
3274   gfc_free_expr (expr);
3275   return MATCH_ERROR;
3276 }
3277
3278
3279 /******************** FORALL subroutines ********************/
3280
3281 /* Free a list of FORALL iterators.  */
3282
3283 void
3284 gfc_free_forall_iterator (gfc_forall_iterator * iter)
3285 {
3286   gfc_forall_iterator *next;
3287
3288   while (iter)
3289     {
3290       next = iter->next;
3291
3292       gfc_free_expr (iter->var);
3293       gfc_free_expr (iter->start);
3294       gfc_free_expr (iter->end);
3295       gfc_free_expr (iter->stride);
3296
3297       gfc_free (iter);
3298       iter = next;
3299     }
3300 }
3301
3302
3303 /* Match an iterator as part of a FORALL statement.  The format is:
3304
3305      <var> = <start>:<end>[:<stride>][, <scalar mask>]  */
3306
3307 static match
3308 match_forall_iterator (gfc_forall_iterator ** result)
3309 {
3310   gfc_forall_iterator *iter;
3311   locus where;
3312   match m;
3313
3314   where = gfc_current_locus;
3315   iter = gfc_getmem (sizeof (gfc_forall_iterator));
3316
3317   m = gfc_match_variable (&iter->var, 0);
3318   if (m != MATCH_YES)
3319     goto cleanup;
3320
3321   if (gfc_match_char ('=') != MATCH_YES)
3322     {
3323       m = MATCH_NO;
3324       goto cleanup;
3325     }
3326
3327   m = gfc_match_expr (&iter->start);
3328   if (m != MATCH_YES)
3329     goto cleanup;
3330
3331   if (gfc_match_char (':') != MATCH_YES)
3332     goto syntax;
3333
3334   m = gfc_match_expr (&iter->end);
3335   if (m == MATCH_NO)
3336     goto syntax;
3337   if (m == MATCH_ERROR)
3338     goto cleanup;
3339
3340   if (gfc_match_char (':') == MATCH_NO)
3341     iter->stride = gfc_int_expr (1);
3342   else
3343     {
3344       m = gfc_match_expr (&iter->stride);
3345       if (m == MATCH_NO)
3346         goto syntax;
3347       if (m == MATCH_ERROR)
3348         goto cleanup;
3349     }
3350
3351   *result = iter;
3352   return MATCH_YES;
3353
3354 syntax:
3355   gfc_error ("Syntax error in FORALL iterator at %C");
3356   m = MATCH_ERROR;
3357
3358 cleanup:
3359   gfc_current_locus = where;
3360   gfc_free_forall_iterator (iter);
3361   return m;
3362 }
3363
3364
3365 /* Match the header of a FORALL statement.  */
3366
3367 static match
3368 match_forall_header (gfc_forall_iterator ** phead, gfc_expr ** mask)
3369 {
3370   gfc_forall_iterator *head, *tail, *new;
3371   gfc_expr *msk;
3372   match m;
3373
3374   gfc_gobble_whitespace ();
3375
3376   head = tail = NULL;
3377   msk = NULL;
3378
3379   if (gfc_match_char ('(') != MATCH_YES)
3380     return MATCH_NO;
3381
3382   m = match_forall_iterator (&new);
3383   if (m == MATCH_ERROR)
3384     goto cleanup;
3385   if (m == MATCH_NO)
3386     goto syntax;
3387
3388   head = tail = new;
3389
3390   for (;;)
3391     {
3392       if (gfc_match_char (',') != MATCH_YES)
3393         break;
3394
3395       m = match_forall_iterator (&new);
3396       if (m == MATCH_ERROR)
3397         goto cleanup;
3398
3399       if (m == MATCH_YES)
3400         {
3401           tail->next = new;
3402           tail = new;
3403           continue;
3404         }
3405
3406       /* Have to have a mask expression */
3407
3408       m = gfc_match_expr (&msk);
3409       if (m == MATCH_NO)
3410         goto syntax;
3411       if (m == MATCH_ERROR)
3412         goto cleanup;
3413
3414       break;
3415     }
3416
3417   if (gfc_match_char (')') == MATCH_NO)
3418     goto syntax;
3419
3420   *phead = head;
3421   *mask = msk;
3422   return MATCH_YES;
3423
3424 syntax:
3425   gfc_syntax_error (ST_FORALL);
3426
3427 cleanup:
3428   gfc_free_expr (msk);
3429   gfc_free_forall_iterator (head);
3430
3431   return MATCH_ERROR;
3432 }
3433
3434 /* Match the rest of a simple FORALL statement that follows an IF statement. 
3435  */
3436
3437 static match
3438 match_simple_forall (void)
3439 {
3440   gfc_forall_iterator *head;
3441   gfc_expr *mask;
3442   gfc_code *c;
3443   match m;
3444
3445   mask = NULL;
3446   head = NULL;
3447   c = NULL;
3448
3449   m = match_forall_header (&head, &mask);
3450
3451   if (m == MATCH_NO)
3452     goto syntax;
3453   if (m != MATCH_YES)
3454     goto cleanup;
3455
3456   m = gfc_match_assignment ();
3457
3458   if (m == MATCH_ERROR)
3459     goto cleanup;
3460   if (m == MATCH_NO)
3461     {
3462       m = gfc_match_pointer_assignment ();
3463       if (m == MATCH_ERROR)
3464         goto cleanup;
3465       if (m == MATCH_NO)
3466         goto syntax;
3467     }
3468
3469   c = gfc_get_code ();
3470   *c = new_st;
3471   c->loc = gfc_current_locus;
3472
3473   if (gfc_match_eos () != MATCH_YES)
3474     goto syntax;
3475
3476   gfc_clear_new_st ();
3477   new_st.op = EXEC_FORALL;
3478   new_st.expr = mask;
3479   new_st.ext.forall_iterator = head;
3480   new_st.block = gfc_get_code ();
3481
3482   new_st.block->op = EXEC_FORALL;
3483   new_st.block->next = c;
3484
3485   return MATCH_YES;
3486
3487 syntax:
3488   gfc_syntax_error (ST_FORALL);
3489
3490 cleanup:
3491   gfc_free_forall_iterator (head);
3492   gfc_free_expr (mask);
3493
3494   return MATCH_ERROR;
3495 }
3496
3497
3498 /* Match a FORALL statement.  */
3499
3500 match
3501 gfc_match_forall (gfc_statement * st)
3502 {
3503   gfc_forall_iterator *head;
3504   gfc_expr *mask;
3505   gfc_code *c;
3506   match m0, m;
3507
3508   head = NULL;
3509   mask = NULL;
3510   c = NULL;
3511
3512   m0 = gfc_match_label ();
3513   if (m0 == MATCH_ERROR)
3514     return MATCH_ERROR;
3515
3516   m = gfc_match (" forall");
3517   if (m != MATCH_YES)
3518     return m;
3519
3520   m = match_forall_header (&head, &mask);
3521   if (m == MATCH_ERROR)
3522     goto cleanup;
3523   if (m == MATCH_NO)
3524     goto syntax;
3525
3526   if (gfc_match_eos () == MATCH_YES)
3527     {
3528       *st = ST_FORALL_BLOCK;
3529
3530       new_st.op = EXEC_FORALL;
3531       new_st.expr = mask;
3532       new_st.ext.forall_iterator = head;
3533
3534       return MATCH_YES;
3535     }
3536
3537   m = gfc_match_assignment ();
3538   if (m == MATCH_ERROR)
3539     goto cleanup;
3540   if (m == MATCH_NO)
3541     {
3542       m = gfc_match_pointer_assignment ();
3543       if (m == MATCH_ERROR)
3544         goto cleanup;
3545       if (m == MATCH_NO)
3546         goto syntax;
3547     }
3548
3549   c = gfc_get_code ();
3550   *c = new_st;
3551
3552   if (gfc_match_eos () != MATCH_YES)
3553     goto syntax;
3554
3555   gfc_clear_new_st ();
3556   new_st.op = EXEC_FORALL;
3557   new_st.expr = mask;
3558   new_st.ext.forall_iterator = head;
3559   new_st.block = gfc_get_code ();
3560
3561   new_st.block->op = EXEC_FORALL;
3562   new_st.block->next = c;
3563
3564   *st = ST_FORALL;
3565   return MATCH_YES;
3566
3567 syntax:
3568   gfc_syntax_error (ST_FORALL);
3569
3570 cleanup:
3571   gfc_free_forall_iterator (head);
3572   gfc_free_expr (mask);
3573   gfc_free_statements (c);
3574   return MATCH_NO;
3575 }